앱을 만들때, 새로운 액티비티를 만들고, 값을 입력한 뒤 액티비티를 종료하여 원래 액티비티로 돌아올 때
입력했던 데이터를 적용해야 하는 경우가 자주 생깁니다.
이런 기능은 startActivityForResult() 메서드 또는ActivityResultLauncher 를 이용해서 해결할 수 있습니다.
안드로이드를 처음 하시는 분들은 먼저 startActivityForResult()를 사용해 보시고, 동작을 익힌 뒤 ActivityResultLauncher 시간이 되신다면 까지 해보시는걸 추천드립니다.
오늘은 예제를 통해 startActivityForResult() 동작을 확인해 보겠습니다.
전체 코드는 마지막에 첨부해드리겠습니다.
1. 먼저, 새로운 액티비티인 SubActivity를 만듭니다.
public class SubActivity extends AppCompatActivity {
Button button;
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub);
button = findViewById(R.id.button);
editText = findViewById(R.id.editText);
// 버튼클릭
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String getName = editText.getText().toString(); // 입력한 이름을 가져옴
Intent intent = new Intent(); // 인텐트 객체 생성
intent.putExtra("name",getName); // 위에서 가져온 데이터를 인텐트에 넣기
setResult(RESULT_OK,intent); // 응답 보내기
finish(); // 현재 액티비티 종료
}
});
}
}
이 setResult() 메서드를 호출할 때 인텐트 객체가 파라미터로 전달됩니다. setResult() 메서드는 새로 띄운 액티비티 (SubActivity)에서 원래 액티비티(MainActivity)로 인텐트를 전달하고 싶을 때 사용하는 메서드로 호출 형식은 다음과 같습니다.
setResult(응답코드, 인텐트)
이 응답코드와 인텐트는 새 액티비티를 띄웠던 원래 액티비티 (MainActivity)에 전달됩니다.
2. MainActivity 에서 SubActivity를 띄우기
public class MainActivity extends AppCompatActivity {
Button newAct_btn;
final int RequestCode = 1001;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
newAct_btn = findViewById(R.id.newAct_btn);
newAct_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getApplicationContext(),SubActivity.class);
startActivityForResult(intent,RequestCode);
}
});
}
}
새로운 액티비티를 띄울 때 startActivityForResult() 메서드를 호출합니다.
startActivity() 메서드는 새로운 액티비티를 띄우기만 하지만
startActivityForResult() 는 새 액티비티를 띄우고 응답을 받을 수 있습니다.
파라미터 값인 RequestCode는 새 액티비티를 띄울 때 전달하는 요청코드입니다.
이 값은 나중에 새 액티비티로부터 데이터를 응답받을 때 다시 전달받게 됩니다.
이 값으로 어떤 액티비티로부터 온 응답인지 구별할 수 있습니다.
3. 응답을 처리하는 메서드 추가합니다.
이제 새로 띄운 SubActivity에서 응답을 처리하는 메서드를 추가합니다.
MainActivity 안에 커서를 클릭하고 오른쪽 마우스 버튼을 누르면 팝업 메뉴가 보입니다. [ Generate -> Override Methods ] 메뉴를 누릅니다.
OR
MainActivity 안에 커서를 클릭하고 Ctrl + O 를 눌러도 똑같은 아래의 화면이 나옵니다.
이제 onActivityResult()메서드를 찾아서 [Ok] 버튼을 누릅니다
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
첫번째 파라미터 requestCode는 새로운 액티비티를 띄울 때 보냈던 요청 코드 입니다.
이 값으로 부터 어떤 액티비티로부터 응답을 받은 것인지 구분이 가능합니다.
두번째 파라미터 resultCode는 SubActivity에서 setResult() 메서드로 전달했던 응답코드입니다.
이 응답코드로 새 액티비티에서 처리한 결과가 정상인지 아닌지 구분하려고 사용됩니다.
세 번째 파라메터 data는 새로운 액티비티 였던 SubActivity에서 전달받은 인텐트입니다.
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == RequestCode){
if (resultCode == RESULT_OK){
String name = data.getStringExtra("name"); // 전송받은 name값을 가져옵니다.
response_tv.setText(name); // 텍스트뷰에 전달받은 name을 표시합니다.
}
}
}
이제 앱을 실행해서 동작을 확인해 보세요 .
메인 액티비티에서 "새 액티비티 띄우기 "버튼을 누르면 SubActivity가 띄워지고 이름을 입력한 뒤 종료하기 버튼을 누르면 메인 액티비티로 돌아가게되고, 텍스트뷰에 데이터가 표시됩니다.
다음은 코드 본문입니다.
MainActivity
public class MainActivity extends AppCompatActivity {
Button newAct_btn;
TextView response_tv;
final int RequestCode = 1001;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
newAct_btn = findViewById(R.id.newAct_btn);
response_tv = findViewById(R.id.response_tv);
newAct_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getApplicationContext(),SubActivity.class);
startActivityForResult(intent,RequestCode);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == RequestCode){
if (resultCode == RESULT_OK){
String name = data.getStringExtra("name"); // 전송받은 name값을 가져옵니다.
response_tv.setText(name);
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/newAct_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="125dp"
android:layout_marginTop="327dp"
android:text="새 액티비티 띄우기"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/response_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="104dp"
android:layout_marginBottom="80dp"
android:text="전달받은 값이 들어갈 뷰"
android:textColor="@color/black"
android:textSize="20sp"
app:layout_constraintBottom_toTopOf="@+id/newAct_btn"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
SubActivity
public class SubActivity extends AppCompatActivity {
Button button;
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub);
button = findViewById(R.id.button);
editText = findViewById(R.id.editText);
// 버튼클릭
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String getName = editText.getText().toString(); // 입력한 이름을 가져옴
Intent intent = new Intent();
intent.putExtra("name",getName);
setResult(RESULT_OK,intent);
finish();
}
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SubActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="158dp"
android:layout_marginTop="288dp"
android:text="종료하기"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="97dp"
android:layout_marginBottom="70dp"
android:ems="10"
android:inputType="text"
android:hint="이름을 입력하세요"
app:layout_constraintBottom_toTopOf="@+id/button"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
'안드로이드 자바' 카테고리의 다른 글
[Android][Java] Camera2 API를 사용하여 카메라 미리보기 생성하기 (0) | 2024.01.10 |
---|---|
[Android][Java] 팝업메뉴 (2) | 2024.01.03 |
[Android][Java] SQLite Database 데이터베이스 툴 사용하기 (0) | 2023.12.16 |
[JAVA][Android] 사람 이미지 배경 가리기 PorterDuff.Mode (0) | 2023.12.13 |
[Android][Java] 버튼 클릭으로 소리 출력하기 (0) | 2023.12.10 |