jeongiin / Lookie_Android_Study

Lookie Android Part kotlin study
0 stars 0 forks source link

안드로이드 4대 구성요소 - 데이터 전달하기/ 객체 전달하기 #5

Open jeongiin opened 5 years ago

jeongiin commented 5 years ago
  1. Intent에 데이터 셋팅하기
    • Activity 를 실행하기 위해 사용하는 Intent 객체에 putExtra 메서드를 이용하여 데이터를 셋팅하면 실행되는 Activity에서 데이터를 전달 받을 수 있다.
  1. 객체 전달하기
    • parcelable(Intent 를 통해 객체를 전달 할 때 필요한 인터페이스) -> 전달 받은 족에서 객체를 복원할 때 필요한 정보를 가진 부분을 의미 -> A라는 객체에서 만든 값을 B가 복원할 수 있도록 -> 4대 구성요소가 독립적인 실행단위로 따로따로 동작하기 때문에

Main Activity

import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_second.*

class MainActivity : AppCompatActivity() {

    val SECOND_ACTIVITY =1

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

        button.setOnClickListener { view ->
            var t1 = TestClass()
            t1.data10 =100
            t1.data20 = "문자열1"

            var intent = Intent(this, SecondActivity :: class.java)
            intent.putExtra("test1",t1) //t1객체가 가지고 있는 메서드를 호출하여 파슬 클래스 타입 객체 넘김
            startActivityForResult(intent, SECOND_ACTIVITY)
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (resultCode == Activity.RESULT_OK){
            var t2 = data?.getParcelableExtra<TestClass>("test2")
            textView.text = "t2.data10 : ${t2?.data10}\n"
            textView.text = "t2.data20 : ${t2?.data20}"
        }
    }
}

SecondActivity

import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class SecondActivity : AppCompatActivity() {

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

        var t1 = intent.getParcelableExtra<TestClass>("test1")

        textView2.text = "t1.data10 : ${t1.data10}\n"
        textView2.append("t1.data20 : ${t1.data20}\n")

        button2.setOnClickListener { view ->
            var t2 = TestClass()
            t2.data10 = 200
            t2.data20 = "문자열2"

            var intent2 = Intent()
            intent2.putExtra("test2",t2)
            setResult(Activity.RESULT_OK,intent2)
            finish()
        }
    }
}

Test Class

import android.os.Parcel
import android.os.Parcelable

class TestClass : Parcelable {

    var data10 : Int = 0
    var data20 : String?=null

    companion object{
        //static 역할
        @JvmField

        val CREATOR : Parcelable.Creator<TestClass> = object : Parcelable.Creator<TestClass> {
            override fun createFromParcel(p0: Parcel?): TestClass {
                val test = TestClass()//객체 생성
                test.data10 = p0?.readInt()!! //순서대로 호출
                test.data20 = p0?.readString()

                return test // 객체 복원됨
            }

            override fun newArray(p0: Int): Array<TestClass?> {
                //객체 하나가 아니라 배열일 때
                return arrayOfNulls<TestClass>(p0)
            }
        }
    }

    override fun writeToParcel(p0: Parcel?, p1: Int) {
        //매개변수로 Parcle 객체가 들어옴, 객체를 담음
        p0?.writeInt(data10)
        p0?.writeString(data20)
        //순서에 맞춰서 가져와야함
        //객체를 전달 할 떄 writeToParcel이 자동으로 호출됨
    }

    override fun describeContents(): Int {
        return 0
    }

}