내일배움캠프 20일차

김재현·2024년 3월 25일

오늘은 저번에 못했던 추가기능을 다시 한번 구현해보았습니다.

회원 가입 페이지에서 입력한 아이디/비밀번호가 회원 가입 버튼을 눌러 로그인 화면으로 이동할 때 자동으로 입력되도록 구현합니다.

Hint : registerForActivityResult 를 알아봅시다.

검색해보고 같은 조원분 코드와 비교도 해보면서 구현해보았습니다.

https://velog.io/@thundevistan/Android-Studio-registerForActivityResult
https://jige.tistory.com/36

다음 두 블로그를 보면서 이해하고 구현해봤는데 원래 제 코드를 수정하고 class에서 다시 전역변수를 선언하고 함수 setResultNext를 선언해주면서 코드를 바꿔보았습니다.

class SignInActivity : AppCompatActivity() {
    private lateinit var edit_id: EditText
    private lateinit var edit_password: EditText
    private lateinit var resultLauncher: ActivityResultLauncher<Intent>
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sign_in)
  • override fun 하기 전에 전역변수 선언과 만들어준 변수 resultLauncher에

    registerForActivityResult메소드를 활용해서 ActivityLauncher를 만들어 준다.

  • 그리고 받아오는 함수를 만들기 전에 값을 보내는 SignUpActivity를 수정해줬는데

    edit_id와 edit_password를 전역변수로 다시 설정해줬다.

class SignUpActivity : AppCompatActivity() {

    private lateinit var edit1:EditText
    private lateinit var edit_id:EditText
    private lateinit var edit_password:EditText
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sign_up)
  • 그리고 private fun signUp을 만들어 SignUpActivity(회원가입)에서 SignInActivity(로그인)로 받은 아이디와 비밀번호를 전달해주기 위한 함수를 만들어주었다.
private fun signUp() {
	val intent = Intent(this@SignUpActivity, SignInActivity::class.java)
    intent.putExtra("id", edit_id.text.toString())
    intent.putExtra("password", edit_password.text.toString())
    setResult(RESULT_OK, intent)
    finish()
}

그 다음 SignInActivity로 돌아와서 회원가입 버튼을 눌렀을 때 코드를 다음과 같이 바꿔줬다.

btn_in2.setOnClickListener {
	val intent = Intent(this, SignUpActivity::class.java)
    resultLauncher.launch(intent)
}
  • 원래는 resultLauncher.launch(intent)가 startActivity(intent)였는데

    Activity 이동 및 ActivityResult 수신을 위해 바꿔주었다.

private fun setResultNext() {
	resultLauncher =
		registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
			if (result.resultCode == Activity.RESULT_OK) {
            	val id = result.data?.getStringExtra("id") ?: ""
                val password = result.data?.getStringExtra("password") ?: ""
                edit_id.setText(id)
                edit_password.setText(password)
			}
		}
}
  • SignUpActivity에서 보낸 아이디/비밀번호를 함수 setResultNext를 통해 받아오고 다음과 같이 setResultNext를 설정(?)해주면 된다.


아이디와 비밀번호 가져오는 것도 성공!

  • 처음에는 변수설정만 해주고 계속 안되서 답답했었는데 조원분의 도움도 받고 검색하다보니 됐다!
resultLauncher =
	registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
		if (result.resultCode == Activity.RESULT_OK) {
    		val id = result.data?.getStringExtra("id") ?: ""
        	val password = result.data?.getStringExtra("password") ?: ""
        	edit_id.setText(id)
        	edit_password.setText(password)
val intent = Intent(this@SignUpActivity, SignInActivity::class.java)
	intent.putExtra("id", edit_id.text.toString())
    intent.putExtra("password", edit_password.text.toString())
    setResult(RESULT_OK, intent)
    finish()

처음에는 두 문장 모두 함수안에 넣지않은 다음과 같은 형태로 진행하였는데

두 문장을 private fun 안에 넣어서 동작하게 만들어줬더니 잘 동작되었다.

사실 아직 개념자체는 좀 이해가 잘 안되지만...사용만 해본 것 같다 ㅠㅠ

하루의 마무리

  • 오늘은 뭔가 몸이 좀 몸살오기 직전의 느낌이라 싫다 ㅠㅠ 비도오고 으슬으슬하다 ㅠㅠ

    주말동안 결혼식 뒷풀이 너무 신나게 다녀와서 그런가 몸살난 것 같다.

    오늘은 일찍 자고 내일은 튜터님께 저번 스탠다드반 과제 피드백 받으러 가야겠다!

0개의 댓글