[Android 앱 개발 입문] 과제 - 자기소개 앱 (3)선택 과제1 (feat. registerForActivityResult)

0
post-thumbnail
post-custom-banner

🍥구현 기능

  • 회원가입 성공 후, 로그인 화면으로 돌아왔을 때,
    로그인 화면의 이름 및 비밀번호 입력 EditText에 회원가입한 이름과 아이디가 자동으로 입력되도록 구현하기
  • registerForActivityResult를 이용해 구현하기

🍥구현하기

📌참고자료: 활동에서 결과 가져오기 | Android 개발자

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() 호출됨

SignInActivity 클래스

  • onCreate 함수 안에서 ActivityResultLauncher(=startForResultLauncher) 정의
  • 회원가입 버튼이 클릭되면,
    앞서 정의한 ActivityResultLauncher(=startForResultLauncher)를 사용해 Intent 실행
    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)
        }
    }

SignUpActivity 클래스

  • finishSignUpActivity(name:String, password:String)
    • 회원가입 성공 후, 호출됨
    • 회원가입에 사용한 이름과 비밀번호를 매개변수로 받음
      -> Activity 실행 결과로 전달할 Intent(=resultIntent) 생성
      -> Intent에 이름을 담은 Extra와 비밀번호를 담은 Extra 저장
      -> setResult 함수로 Activity 실행 결과 저장
      -> finish() 함수로 Acvitiy 종료
    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()
    }
profile
Be able to be vulnerable, in search of truth
post-custom-banner

0개의 댓글