본문 바로가기

개발 노트/Kotlin

registerForActivityResult() 사용법

registerForActivityResult()는 양방향으로 데이터를 주고받는 경우에 주로 사용한다

StartActivity(intent)로 계속해서 엑티비티 호출을 반복하게되면, 엑티비티 스택에 계속해서 엑티비티가 쌓이는 문제가 생기는데 이를 방지하기위해 registerForActivityResult()를 사용한다!!

 

 

내가 지금 구현하고자하는 것은

회원가입화면, 로그인화면

 

첫번째 페이지에서 이름,아이디,비밀번호값을 입력하고 회원가입버튼을 누르면 

두번째화면으로 이동하면서 첫번째화면에서 입력했던 아이디,비밀번호값이 해당화면에 반영이 되고

두번째화면에서 회원가입버튼을 누르면 다시 첫번째화면으로 돌아가도록 하는것이다

 

여기에서도 볼때 회원가입화면에서 로그인화면으로 돌아갈때마다 매번 로그인화면이 생성이 되므로 엑티비티 스택에 계속 엑티비티가 축적되는 문제가 발생한다

 

 

 

 

 

# registerForActivityResult() 사용하기

먼저 로그인화면에서 콜백을 등록해줘야한다

데이터를 받을 엑티비티에서 생성해줘야한다

class SignInActivity : AppCompatActivity() {


    private lateinit var getContent : ActivityResultLauncher<Intent>


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sign_in)

        ...

        // 데이터를 받을 엑티비티에서 생성
        val getContent = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            // Handle the returned result
            if(result.resultCode == Activity.RESULT_OK){

                // SignUpActivity로부터 받은 데이터
                val id = result.data?.getStringExtra("id")     //id값 받아옴
                val password = result.data?.getStringExtra("password") //password값 받아옴

                // editText에 표시
                id_et.setText(id)
                password_et.setText(password)
            }
        }

 

registerForActivityResult() 메소드를 사용해서

ActivityResultContracts인자와 ActivityResultCallback인자를 생성해준다

 

ActivityResultCallback은 함수형인자 이기 때문에 중괄호 안에 있는 부분이다

 

ActivityResultContracts.StartActivityForResult를  썼는데 StartActivityForResult는 화면을 나갔다가 돌아왔을때 정보를 가지고 오는 방식을 예로 들수있다(카메라로 찍은 사진에 대한 정보를 가지고오는것도 이에 해당)

 

이 콜백함수안에서 실행시킬 코드를 적어주고 이게 실행이되면 결과값이 getContent변수에 Launcher로 저장이된다

Launcher는 결과값이라고 생각해주면 된다

 

 

// 회원가입 버튼 클릭시
signbtn.setOnClickListener {
    val intent = Intent(this, SignUpActivity::class.java)

    getContent.launch(intent)  

}

 

getContent.launch(intent)를 실행해서 이동할때 결과값을 같이 넘겨준다 (getContent의 결과값을 넘겨줌)

원랜 StartActivity(intent)를 썼던 코드이다

 

 

// 회원가입 버튼 클릭시
signBtn.setOnClickListener {
   
    val name_get = name.text.toString()
    val id_get = id.text.toString()
    val password_get = password.text.toString()


    if(name_get.isEmpty() || id_get.isEmpty() || password_get.isEmpty()){
        Toast.makeText(this, "입력되지 않은 정보가 있습니다", Toast.LENGTH_SHORT).show()
    }else{
        val intent = Intent(this, SignInActivity::class.java)
        intent.putExtra("id", id_get)       
        intent.putExtra("password",password_get)    

        // 새로운 activity에서 데이터보내기
        setResult(RESULT_OK, intent)
        Toast.makeText(this, "회원가입 완료!", Toast.LENGTH_SHORT).show()
        finish() 
    }

 

그다음 데이터를 보내는 엑티비티에서는 setResult를 사용해서 회원가입버튼을 눌러서 로그인화면으로 이동할때 값을 전달해준다

 

 

 

# 구현 화면

 

회원가입에서 입력한 아이디/비밀번호가 버튼을 눌러 로그인화면으로 이동했을때 자동으로 로그인화면에 반영되는것을 확인할 수 있다 

 

 

 

 

 

 

# 공식문서와 이해하는데 도움됐던 블로그 첨부!

 

https://developer.android.com/training/basics/intents/result?hl=ko#kotlin

 

활동에서 결과 가져오기  |  Android 개발자  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 활동에서 결과 가져오기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 앱 내에서든 다른 앱에서든

developer.android.com

 

https://blog.naver.com/PostView.naver?blogId=tgyuu_&logNo=222964718402&parentCategoryNo=&categoryNo=14&viewDate=&isShowPopularPosts=false&from=postView

 

registerForActivityResult (Kotlin)

다른 화면으로 넘어갔다가 다시 원 화면으로 돌아올때, 다른 화면에서 값을 얻어오고 싶을때. 우리는 regis...

blog.naver.com

 

https://thdbs523.tistory.com/372

 

[안드로이드/코틀린] registerForActivityResult() - activity간 데이터 전달

기존 방식 - startActivityForResult 먼저 activity간 데이터를 전달하는 기존 방식을 알아보자. 자세히 말하면 새로운 activity로 이동하고, 그 activity가 닫힐 때 결과를 받아오는 것이다. 1. 데이터를 받을 a

thdbs523.tistory.com