이곳저곳 관심이 많아요
10. Intent : MainActivity -> SubActivity 값 전달 본문
1. MainActivity
package com.example.myapplication
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import androidx.activity.result.ActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
const val EXTRA_MESSAGE_STR = "com.example.myapplication.message"
const val RETURN_MESSAGE_STR = "com.example.myapplication.return"
class MainActivity : AppCompatActivity() {
//당장 초기화 할 수 없을 때 lateinit 사용
lateinit var editText: EditText
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val button: Button = findViewById(R.id.button)
editText = findViewById(R.id.editText)
button.setOnClickListener {
var str = editText.text.toString()
var i = Intent(this, SubActivity::class.java)
i.putExtra(EXTRA_MESSAGE_STR, str)
//서브엑티비티로부터 값을 전달받기 위해서는 아래와 같이 서브 엑티비티를 불러와야함
//아래 메소드가 결과가 있어야지만 엑티비티 콜백 메소드 호출됨
startForResult.launch((i))
//예전에는 서브엑티비티의 값 전달을 무작정 기다림 but 오류나는 일 있어서
//ActivityResultContracts 에 의해서 동작하고
//엑티비티와 콜백 메소드가 분리돼서 동작하도록 변경됨
//제대로 전달 받았으면 콜백 메소드를 실행해라 이렇게됨
//registerForActivityResult 는 서브엑티비티에서 결과를 돌려줄 때 필요한 메소드
}
}
//registerForActivityResult 서브 엑티비티에서 결과를 전달받았을 때 실행됨됨
private val startForResult = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()){
result: ActivityResult -> //파라미터를 하나 전달받음, 그 안에 엑티비티 결과가 담겨있음
if(result.resultCode == Activity.RESULT_OK){
//인텐트 자체도 null 이 아닐 때
if(result.data != null){
//result.data 까지가 인텐트 객체임. 따라서 null-safety 처리하기
//val t:Intent? = result.data
//result.data == 인텐트, result.data.extras == 인텐트에 담겨온 번들객체
val extras:Bundle? = result.data?.extras
//Elvis 연산자 사용
val returnString = extras?.getString(RETURN_MESSAGE_STR) ?: null
editText.setText(returnString)
}
}
}
}
2. SubActivity
package com.example.myapplication
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity
class SubActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_sub)
val editText: EditText = findViewById(R.id.editText)
var extras= intent.extras ?: null
if(intent.hasExtra(EXTRA_MESSAGE_STR)){
var msg:String? = extras?.getString(EXTRA_MESSAGE_STR)
editText.setText("수신 메시지는 $msg")
}
val button: Button = findViewById(R.id.button)
button.setOnClickListener {
val data = Intent() //메인에서 서브 호출시 인텐트객체 불러올땐 파라미터 필요하지만 반대는 필요없다.
val returnString = editText.text.toString()
//메인에서 서브로 데이터 전달하는 것과 동일하게 putExtra(key, value) 전달하기
data.putExtra(RETURN_MESSAGE_STR, returnString)
setResult(Activity.RESULT_OK, data)
finish()
}
}
}
'Programming > Android' 카테고리의 다른 글
11. Fragment (0) | 2021.12.07 |
---|---|
10. Intent : MainActivity <-> SubActivity 최종 (0) | 2021.12.05 |
11. RecyclerView : 리사이클러뷰 전체정리, ViewModel 적용 (0) | 2021.12.03 |
10. Intent : Implicit intent (0) | 2021.11.05 |
Comments