Android[kotlin] - registerForActivityResult()

안지현·2023년 4월 7일
0

Android[kotlin]

목록 보기
5/8

registerForActivityResult() 사용하기

기존에는 액티비티에서 값을 받아올 때 startActivityForResult()onActivityResult()를 사용했지만 deprecated 되었다.

Activity 클래스에서 사용할 수 있지만, Androidx Activity와 Fragment에 도입된 Activity Result API 사용을 적극 권장한다고 한다!!

🤩 MainActivity <-> SecondActivity 쌍방향 데이터 전달 가능!

registerForActivityResult를 통해 내가 하려는 것

MainActivity <-> SignUpActivity 간에 데이터 전달!

사용방법

1. ActivityResultLauncher자료형인 getResult 변수를 전역 변수로 선언

 private lateinit var getResult : ActivityResultLauncher<Intent>

2. 만들어준 변수 getResult에 registerForActivityResult메소드를 활용해서 ActivityLauncher 를 만든다.

!! registerForActivityResult메소드의 파리미터는 ActivityResultContract, >ActivityResultCallback가 필요하다.
!! ActivityResultContract는 startActivityForResult를 비롯하여 다양한 객체들이 있다.
!! ActivityResultCallback은 람다로 사용하고 ActivityResult 객체가 파라미터로 떨어지고 여기서 원하는 데이터를 가져오면 된다.
그 후 result.resultCode가 올바르게 넘어오면 B액티비티에서 넘겨준 이름과 나이를 getStringExtra로 받는다.

getResult = registerForActivityResult(
            ActivityResultContracts.StartActivityForResult()
        ){result -> 
            if(result.resultCode == RESULT_OK){
                val getId = result.data?.getStringExtra("id") ?: ""
                val getPw = result.data?.getStringExtra("pw") ?: ""
                val getName = result.data?.getStringExtra("name") ?: ""
                val getTalent = result.data?.getStringExtra("talent") ?: ""
                Snackbar.make(
                    binding.root,
                    "회원가입이 완료되었습니다.",
                    Snackbar.LENGTH_SHORT
                ).show()
         }

3. 만들어준 getResult.launch()를 통해 데이터를 받아올 Activity를 실행한다.

binding.signUpBtn.setOnClickListener {
            val intent = Intent(this, SignUpActivity::class.java)
            getResult.launch(intent)
        }

4. 데이터를 보내줄 Activity인 SignUpActivity에서 setResult를 등록한다.

val intent = Intent(this, MainActivity::class.java)
                    intent.putExtra("id", id.text.toString())
                    intent.putExtra("pw", pw.text.toString())
                    intent.putExtra("name", name.text.toString())
                    intent.putExtra("talent", talent.text.toString())
                    setResult(RESULT_OK, intent)
                    finish()

출처 - https://jige.tistory.com/36

0개의 댓글