20230807 registerForActivityResult

기메단·2023년 8월 7일
0

TIL

목록 보기
16/44
post-thumbnail

구현한 기능

  • 회원 가입페이지에서 입력한 아이디/비밀번호가 로그인 화면으로 돌아올 때 자동 입력되는 기능
  • registerForActivityResult 사용

registerForActivityResult란

기존의 'startActivityForResult'를 함수가 deprecated되고 이를 대체하기 위해 도입된 것. 다른 액티비티로부터의 결과를 콜백 형태로 처리할 수 있고, 더 직관적으로 구현 가능.

-SignInActivity

package com.example.signin

import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.Editable
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import kotlin.math.sign

class SignInActivity : AppCompatActivity() {

    private lateinit var resultLauncher: ActivityResultLauncher<Intent> // ActivityResultLauncher 자료형인 resultLauncher 변수를 전역 변수로 선언. 
    private lateinit var signId : EditText
    private lateinit var signPassword : EditText

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

        signId = findViewById<EditText>(R.id.id)
        signPassword = findViewById<EditText>(R.id.password)
        val loginBtn = findViewById<Button>(R.id.loginButton)
        val upBtn = findViewById<Button>(R.id.upButton)

        resultNext()

        loginBtn.setOnClickListener {
                    if (signId.text.isEmpty() || signPassword.text.isEmpty()) {
                        Toast.makeText(this, "아이디/비밀번호를 확인해주세요.", Toast.LENGTH_SHORT).show()
                    } else {
                        Toast.makeText(this, "로그인 성공!", Toast.LENGTH_SHORT).show()
                        val intent = Intent(this, HomeActivity::class.java)
                        val id = signId.text.toString()
                        intent.putExtra("ID", id)
                        startActivity(intent)

                    }

        }
        upBtn.setOnClickListener {
            val intent = Intent(this, SignUp::class.java)
            resultLauncher.launch(intent) //  startActivity 와 동일한 기능.
        }
    }
    private fun resultNext() {
        resultLauncher = registerForActivityResult(
            ActivityResultContracts.StartActivityForResult()) { result ->
            // 결과값을 받아옴 
            if (result.resultCode == RESULT_OK) {
				
                // 회원가입 페이지에서 넘긴 정보를 getExtra로 받아온다. 
                val editId = result.data?.getStringExtra("id")
                val editPassword = result.data?.getStringExtra("password")

                signId.text = Editable.Factory.getInstance().newEditable(editId)
                signPassword.text = Editable.Factory.getInstance().newEditable(editPassword)
            }
        }
    }

}

-SignUpActivity

    package com.example.signin

    import android.annotation.SuppressLint
    import android.app.Activity
    import android.content.Intent
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import android.widget.Button
    import android.widget.EditText
    import android.widget.Toast
    import androidx.activity.result.contract.ActivityResultContracts

    class SignUp : AppCompatActivity() {

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

            val name = findViewById<EditText>(R.id.name)
            val signUpId = findViewById<EditText>(R.id.textId)
            val signUpPassword = findViewById<EditText>(R.id.upPassword)

            val signUpBtn = findViewById<Button>(R.id.signUpButton)

            signUpBtn.setOnClickListener {
                if ( name.text.isEmpty() || signUpId.text.isEmpty() || signUpPassword.text.isEmpty()) {
                    Toast.makeText(this, "입력되지 않은 정보가 있습니다.", Toast.LENGTH_SHORT).show()
                } else {
                	// putExtra로 정보를 넘겨줌
                    intent.putExtra("id", signUpId.text.toString())
                    intent.putExtra("password", signUpPassword.text.toString())
                    // SignUp 액티비티에서 작업이 완료되면 결과를 이전 액티비티로 전달 
                    setResult(RESULT_OK, intent) // RESULT_OK : 결과 코드, intent : 아이디와 비밀번호를 담고 있음 
                    finish()

                }
            }
        }
    }

4개의 댓글

comment-user-thumbnail
2023년 8월 8일

코드가 정말 깔끔하네요! 주석도 잘 달아주셔서 팍팍 이해하고 갑니다!

답글 달기
comment-user-thumbnail
2023년 8월 8일

오 저는 다른 방법으로 했는데 하나 배워갑니다! :)

답글 달기
comment-user-thumbnail
2023년 8월 8일

제가 아직 시도하지 않은기능인데 천천히 살펴보면서 저한테도 한 번 도입해 봐야겠어요

답글 달기
comment-user-thumbnail
2023년 8월 8일

계속 시도하던건데 배워갑니다!!

답글 달기