Register a callback for an activity result
- registerForActivityResult()
- Activity Result API가 제공하는 result callback을 등록하기 위한 API
- 매개변수로 받는 값: ActivityResultContract, ActivityResultCallback
- 반환하는 값: ActivityResultLauncher
- ActivityResultContract
- activity result를 위한 input 타입과 output 타입 정의
- API가 default contracts 제공
- ActivityResultContracts.StartActivityForResult
input 타입: Intent, ouput 타입: ActivityResult- ActivityResultCallback
- 하나의 메서드 onActivityResult()를 가진 인터페이스
- ActivityResultContract로 정의한 ouput 타입의 객체를 매개변수로 받는다
Launch an activity for result
- registerForActivityResult()는 result callback을 등록하기만 할 뿐
- ActivityResultLauncher
- launch() 함수를 호출해 새로운 Activity를 실행시키고, result를 요청
- ActivityResultContract로 정의한 input 타입의 객체를 매개변수로 받는다
- 새롭게 실행된 Activity가 종료되면, ActivityResultCallback의 onActivityResult() 호출됨
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_sign_in)
...
val startForResultLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result.resultCode == Activity.RESULT_OK) {
Log.d(TAG, "startForResultLauncher) RESULT_OK")
val intent = result.data
intent?.let {
val signUpName = it.getStringExtra("signUpName") ?: " "
val signUpPassword = it.getStringExtra("signUpPassword") ?: " "
Log.d(TAG, "startForResultLauncher) $signUpName $signUpPassword")
nameEditText.setText(signUpName)
passwordEditText.setText(signUpPassword)
}
}
}
signUpButton.setOnClickListener {
val intent = Intent(applicationContext, SignUpActivity::class.java)
startForResultLauncher.launch(intent)
}
}
private val signUpOnClickListner = object : OnClickListener {
override fun onClick(p0: View?) {
//회원가입하기 위해 모든 입력 유효한지 확인
if (isNameValid && isEmailValid && isPasswordValid && isPasswordCheckValid) {
Log.d(TAG, "sign up button) sign up success")
signUpWarningTextView.setInvisible()
...
finishSignUpActivity(name, password)
} else {
Log.d(TAG, "sign up button) sign up fail")
signUpWarningTextView.setVisible()
}
}
}
private fun finishSignUpActivity(name:String, password:String){
val resultIntent = Intent()
resultIntent.putExtra("signUpName", name)
resultIntent.putExtra("signUpPassword", password)
setResult(Activity.RESULT_OK, resultIntent)
finish()
}