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
https://thdbs523.tistory.com/372
'개발 노트 > Kotlin' 카테고리의 다른 글
버튼에 elevation 속성값을 지정했음에도 그림자가 안보일때 (0) | 2024.03.21 |
---|---|
ConstraintLayout - chain, bias (0) | 2024.03.21 |
Android 앱개발 입문과제(LV4) - 추가구현 (0) | 2024.03.18 |
Android 앱개발 입문과제(LV3) - 자기소개 페이지 만들기 (0) | 2024.03.18 |
Android 앱개발 입문과제(LV2) - 회원가입 페이지 만들기 (0) | 2024.03.18 |