구현한 기능
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()
}
}
}
}
코드가 정말 깔끔하네요! 주석도 잘 달아주셔서 팍팍 이해하고 갑니다!