Android

[Android] registerForActivityResult() 구현하기

조예_ 2023. 8. 3. 19:23

registerForActivityResult()란?

Activity 또는 Fragment에서, Activity Result API에서 제공하는 registerForActivityResult() API를 통해서 결과 콜백을 등록할 수 있음. startActivityForResult 또는 onActivityResult의 개념이 registerForResultActivity로 변경이 되는 부분

 

registerForActivityResult() 사용 방법

기본 틀은 intent 사용법과 동일하나 조금씩 차이가 있다.!

 

 

* 데이터를 넘길 때 사용

class SignUpActivity : AppCompatActivity() {

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

        val id = findViewById<EditText>(R.id.edt_id)
        val pw = findViewById<EditText>(R.id.edt_pw)
       
        val btnSignUp = findViewById<Button>(R.id.btn_sign)


        btnSignUp.setOnClickListener {
            
                val homeIntent = Intent(this, SignInActivity::class.java)
                    .putExtra("id", id.text.toString())
                    .putExtra("pw", pw.text.toString())
                  
                // id, pw 정보를 SignInActivity로 보내주는 역할을 함
                
                setResult(RESULT_OK, homeIntent)
                finish()
        }
    }
}

 

 

* 데이터를 가져올 때 사용

class SignInActivity : AppCompatActivity() {

    private lateinit var resultLauncher: ActivityResultLauncher<Intent>
    private lateinit var id: EditText
    private lateinit var pw: EditText
   
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sign_in)

        id = findViewById(R.id.edt_id_sign_in)
        pw = findViewById(R.id.edt_pw_sign_in)
        val btnSignUp = findViewById<Button>(R.id.btn_sign_sign_in)

        setResultSignUp()

		//resultLauncher.launcher()를 통해 데이터를 받아올 Activity 실행해줌
        btnSignUp.setOnClickListener {
            val intent = Intent(this, SignUpActivity::class.java)
            resultLauncher.launch(intent)
        }
    }

    // 콜백 선언해줌
    //콜백 선언한 값을 intent와 resultCode를 사용해 원하는 데이터를 가져오면 된다.
    
    private fun setResultSignUp() {
        resultLauncher = registerForActivityResult(
            ActivityResultContracts.StartActivityForResult()
        ) { result ->

            if (result.resultCode == RESULT_OK) {
                val resultId = result.data?.getStringExtra("id") ?: ""
                val resultPw = result.data?.getStringExtra("pw") ?: ""
               
                id.setText(resultId).toString()
                pw.setText(resultPw).toString()
              
            }
        }
    }
}

 

참고

registerForActivityResult는 initialization, onAttach(), onCreate()에 registerForActivityResult()를 호출해야 한다고 나와있습니다

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