현재 액티비티에서 다른 액티비티를 실행해 어떤 내용을 실행한 후
결과값을 현재 액티비티로 다시 가져오는 방법
(급한 분은 바로 MainActivity.kt코드로 내려가기)
A, B 두 액티비티가 있다고 하자.
A에서 B를 실행할 건데, 일반적인 액티비티 실행과 마찬가지로 intent를 생성하고
startActivity 대신 startActivityForResult를 사용해 B를 띄운다.
startActivity는 인수로 intent만 들어갔지만
startActivityForResult의 인수로는 intent와 requestCode가 들어간다.
이 requestCode는 이후 다시 B로부터 값을 받아올 때 이 액티비티가 B가 맞는지 식별하는 역할을 한다.
(A액티비티에서 B말고도 다른 액티비티를 startActivityForResult로 호출했을 수 있으니
원하는 결과값을 달라고 하기 전에 B가 맞는지 식별하는 과정 필요)
B에서 작업이 끝나고 B 액티비티가 종료되면 A로 돌아오는데,
B가 종료되기 전에 setResult로 결과의 종류를 의미하는 resultCode를 함께 담을 수 있다.
A로 돌아온 후 실행한 결과값을 받아오기 위해서 onActivityResult를 사용한다.
onActivityResult에서 requestCode로 B액티비티인지(또는 다른 액티비티인지) 확인하고
resultCode로 어떤 종류의 결과를 가져왔는지 구분할 수 있다.
.
.
라고 쓰려고 했는데 이건 옛날 기술인 것 같다
코틀린에서 사용하려고 했더니
'startActivityForResult(Intent!, Int): Unit' is deprecated. Deprecated in Java 란다.
2021 07 17, 코틀린에서는 onActivityResult대신
registerForActivityResult 를 사용한다.
기본적인 원리는 비슷한 것 같은데, 이렇게 사용한다.
MainActivity에서 SomeActivity를 실행해 종료 후 결과값을 받아오고 싶다.
본론 시작
MainActivity.kt
val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val myData: Intent? = result.data
val stringData = myData.getStringExtra("dataName")
//또는 이렇게
val stringData2 = result.data?.getStringExtra("dataName")
// 기타 등등 작업 수행
}
}
fun openSomeActivityForResult() {
val intent = Intent(this, SomeActivity::class.java)
resultLauncher.launch(intent)
}
SomeActivity.kt
button.setOnClickListener{
val intent = (this, MainActivity::class.java)
intent.putExtra("dataName", "blahblahblah")
setResult(Activity.RESULT_OK, intent)
finish()
}
MainActivity에서
registerForActivityResult 함수를 변수 안에 담는다. 이 함수는 StartActivityForResult를 인자로 받는다.
(코틀린에서는 ActivityResultContracts.StartActivityForResult)
함수 바디에 if문을 넣어 result개체로부터 resultCode를 확인하고
result의 intent로부터 Extra들 중 원하는 내용을 받아오거나 기타 작업을 수행한다.
** requestCode는 없어졌다
참고 : https://pluu.github.io/blog/android/2020/05/01/migation-activity-result/
SomeActivity를 시작할 함수(위에서는 openSomeActivityForResult)를 정의한다.
그 안에서 이동할 SomeActivity의 intent를 만들고
위에서 registerForActivityResult 함수를 담은 변수에 .launch(intent) 하여
새 액티비티인 SomeActivity를 시작한다.
SomeActivity에서는 MainActivity에 대한 intent를 생성해 putExtra로 데이터를 담고
setResult에 reaultCode와 intent를 인수로 준다.
그리고 finish()로 SomeActivity를 종료하면
MainActivity로 돌아가서 reaultLauncher함수에 작성한 내용들이 실행된다.
'Android > Kotlin' 카테고리의 다른 글
[Android/Kotlin] EditText 내용 비어있는지 빈 칸 확인하기 null check (0) | 2021.08.14 |
---|---|
[Android/Kotlin] 많이 쓰이는 홍보 배너 형태의 뷰 만들기 : ViewPager2 (1) | 2021.08.11 |
메모) RecyclerView GridLayout 아이템 간 간격, 크기 조정 (0) | 2021.08.08 |
[Android/Kotlin] 하단 네비게이션 바 BottomNavigation 만들기, 프래그먼트 상태 유지 (0) | 2021.08.08 |
[Android/Kotlin] RecyclerView등의 Adapter어댑터에서 액티비티 종료하기, setResult하기 (0) | 2021.07.29 |