본문 바로가기

Android

registerForActivityResult

사용 이유

  • 액티비티끼리 데이터를 주고받을 때 사용
  • Activity or Fragment에 있을 때, 결과 콜백을 처리

사용 예제

  • A 액티비티에서 -> B 액티비티로 이동
  • B 액티비티에서 데이터 입력 받음
  • B 액티비티에서 데이터를 A 액티비티로 콜백
  • A 액티비티에서 B 액티비티가 넘겨준 값 확인

구조

public final <I, O> ActivityResultLauncher<I> registerForActivityResult(
    @NonNull ActivityResultContract<I, O> contract,
    @NonNull ActivityResultCallback<O> callback
)

 

  • registerForActivityResult : ActivityResultContract와 ActivityResultCallback을 인자로 가짐
  • ActivityResultContract : registerForActivityResult에서 반환된 ActivityResultLauncher가 어떤 행동을 할지를 결정하는 역할
  • ActivityResultContracts.StartActivityForResult() : 다른 액티비티를 실행하고 해당 액티비티에서 결과를 받아오는 행동
  • ActivityResultCallback : ActivityResultContract 실행 후 결과를 처리, 람다식 사용해서 더 간단하게 구현


사용 방법

 

A Activity

val et_data = findViewById<EditText>(R.id.et_data)

// 두번재 인자 ActivityResultCallback 람다식으로 구현
val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->

    // resultCode : 액티비티 실행 결과 코드
    if (result.resultCode == Activity.RESULT_OK) {

        //B 액티비티에서 전달한 데이터 받아옴
        val data = result.data?.getStringExtra("CallBackData")

        et_data.setText(data)
    }
}


val btn = findViewById<Button>(R.id.btn)

btn.setOnClickListener {

    val intent = Intent(this, BActivity::class.java)

    //resultLauncher.launch() : 데이터를 받아올 Activity 실행
    resultLauncher.launch(intent)
}

 

B Activity

intent.putExtra("CallBackData", "콜백하고 싶은 데이터")
setResult(RESULT_OK, intent)
finish()

'Android' 카테고리의 다른 글

Selector  (0) 2023.08.08
Font 변경  (0) 2023.08.04
ImageView 이미지 넣기 (코드)  (0) 2023.08.03
Android Activity와 Intent  (3) 2023.08.02
Android UI  (2) 2023.08.01