Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

이곳저곳 관심이 많아요

10. Intent : MainActivity -> SubActivity 값 전달 본문

Programming/Android

10. Intent : MainActivity -> SubActivity 값 전달

킹수맨 2021. 11. 5. 13:02

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()
        }
    }

}
Comments