반응형
원래 안드로이드에서는 Activity로부터 결과 값을 수신 받을 때,
startActivityForResult(), onActivityResult()를 사용했지만 deprecated 되었습니다.
이에 따라 공식문서에서 제안한 새로운 방식인 registerForActivityResult()를 사용해보겠습니다.
private lateinit var resultLauncher: ActivityResultLauncher<Intent>
먼저, MainActivity에서 값을 제네릭으로 처리해줄 Launcher 인스턴스 변수를 생성합니다.
Intent 객체를 전달받기 위해 Intent를 제네릭에 명시해주었습니다.
nextBtn.setOnClickListener {
val intent = Intent(this, SecondActivity::class.java)
resultLauncher.launch(intent) // startActivityForResult 랑 동일한 기능 이다.
}
값을 얻어올 SecondActivity에 대한 Intent 변수를 launch() 메서드와 함께 선언합니다.
backBtn.setOnClickListener {
if (inputName.text.isNullOrBlank()) {
Toast.makeText(this, "이름 입력해주세요", Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
intent.putExtra("name",inputName.text.toString())
setResult(RESULT_OK,intent)
finish()
}
이동한 SecondActivity에서는 저희가 다루어야할 실제 값들을 옮겨줄 처리를 진행합니다.
resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode == RESULT_OK) {
val name = it.data?.getStringExtra("name") ?: ""
textName.text = "이름 : $name"
}
}
다시 MainActivity로 복귀했을 시, 값을 확인하기 위한 콜백을 기존의 launcher 변수를 통해 선언하여,
Activity간의 값 전달, 결과를 확인할 수 있습니다.
참고 ->
https://developer.android.com/training/basics/intents/result?hl=ko
반응형