kotlin 4주차-2~3 (registerForActivityResult)

subak96·2023년 8월 9일

registerForActivityResult 란 무엇인가?

registerForActivityResult는 Android Jetpack 라이브러리에서 제공하는 기능 중 하나로, 액티비티나 프래그먼트에서 다른 액티비티나 액티비티를 실행하고 그 결과를 처리하는 데 사용됩니다. 이전에는 startActivityForResult와 onActivityResult 메서드를 사용하여 다른 액티비티를 실행하고 그 결과를 처리했지만, Jetpack 라이브러리에서는 이를 더 편리하게 처리할 수 있는 registerForActivityResult 함수를 제공합니다.
registerForActivityResult 함수는 액티비티나 프래그먼트에서 다른 액티비티를 실행하고 그 결과를 처리할 수 있는 콜백을 등록하는 역할을 합니다. 이를 통해 코드의 가독성을 높이고 결과 처리를 간편하게 할 수 있습니다.
예를 들어, 회원가입 액티비티에서 이름과 비밀번호를 입력받고 이를 다시 로그인 액티비티로 전달하여 화면에 출력하는 경우, registerForActivityResult를 사용하면 두 액티비티 간의 데이터 전달과 결과 처리를 더 효율적으로 처리할 수 있습니다.

한마디로 두 액티비티 간의 데이터 전달을 더 쉽게 할 수 있게해주는 함수라고 보면된다.

예를 들어 A 액티비티에서 버튼을 눌러 B 액티비티로 이동후 값을 입력하고 다시 B에서 버튼을 눌러 A로 돌아오면 B에서 입력한 값이 그대로 A 액티비티에 출력되는것이다. 예시를 들자면 회원가입후 로그인 화면으로 넘어가면 내가 입력했던 아이디와 비밀번호를 또 적을필요없이 미리 출력되어있다면 로그인 버튼만 누르면 되는것과 같다.

-사용법-

먼저 ActivityResult(원하는 데이터값) 를 받고자 하는 액티비티에 Callback등록을 해줘야한다.

A라는 액티비티에
private lateinit var resultLauncher:ActivityResultLauncher< Intent > 를 작성
ActivityResultLauncher자료형인 resultLauncher 변수를 전역 변수로 선언해준다.

private fun '메소드명' 함수를 하나 만들어준뒤 전역 변수로 선언한 resultLauncher에 registerForActivityResult메소드를 활용해서 ActivityLauncher를 생성.

resultLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()) {}

이후 B 액티비티에서 돌아돌 때 값을 받아야하니

resultLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()) { result ->if (result.resultCode == RESULT_OK) {
val ID = result.data?.getStringExtra("ID") ?: ""
val password = result.data?.getStringExtra("password") ?: ""

            textID.text = "$ID"
            textpassword.text = "$password"

        }
    }

이런 형식으로 코드를 작성해준다.

위 코드가 제대로 작동한다면 esult.resultCode에 정보가 넘어오고 B 액티비티에서 넘겨준 ID와 비밀번호를 getStringExtra로 넘겨받는다.

textID , textpassword 은 사용자가 xml에 지정해둔 TextView 또는 EditText의 id이름으로 적어주면된다. private lateinit var를 이용해 전역변수로 선언후 textID = findViewById<>() 를 이용해 초기화를 시켜줘야한다. 버튼또한 초기화 밑 전역변수 선언을 해줘야한다.

이제 데이터를 넘겨받을 B 액티비티를 실행시킬 코드가 필요하니
resultLauncher.launch()를 통해 B 액티비티를 실행시킨다.

resultLauncher.launch()는 맨처음 전역 변수로 선언했던 코드이다.

변수명.setOnClickListener {
val intent = Intent(this, SignpActivity::class.java)
resultLauncher.launch(intent)
}

이렇게 코드를 작성하면 B액티비티로 넘어가고 값을 받아올 준비가 완료된다.

이제 B 액티비티에
intent.putExtra("ID",editTextID.text.toString())
intent.putExtra("password",editTextPassword.text.toString())
setResult(RESULT_OK,intent) 를 입력해주면 된다.

A에서 getStringExtra로 받을 준비를 해줬으니 B 에서는 putExtra라로 넘겨주는것이다.

editTextID , editTextPassword 또한 마찬가지로 전역 변수 선언을 해주고 초기화 시켜줘야한다.

이로써 B 액티비티에서 A 액티비티로 데이터를 보낼 수 있게되었다.

0개의 댓글