티스토리 뷰

반응형

Intent를 사용하여 객체를 전달하고 싶을 때 Parcelable을 사용하면 됩니다.

 

ParcelableClass 만들기

Parcelable을 상속받는 ParcelableClass를 만들겠습니다.

 

 

먼저 전체 코드는 아래와 같습니다.

class ParcelableClass : Parcelable {

    var number: Int = 0
    var name: String? = null

    companion object {
        @JvmField
        val CREATOR : Parcelable.Creator<ParcelableClass> = object : Parcelable.Creator<ParcelableClass> {

            override fun createFromParcel(source: Parcel?): ParcelableClass {
                val data = ParcelableClass()
                data.number = source?.readInt()!!
                data.name = source.readString()

                return data
            }

            override fun newArray(size: Int): Array<ParcelableClass?> {
                return arrayOfNulls<ParcelableClass>(size)
            }
        }
    }

    override fun writeToParcel(dest: Parcel?, flags: Int) {
        dest?.writeInt(number)
        dest?.writeString(name)
    }

    override fun describeContents(): Int {
        return 0
    }
}

 

값을 전달하고자 하는 변수를 맨 위에 선언해줍니다.

var number: Int = 0
var name: String? = null

 

 

writeToParcel와 describeContents를 오버라이드 해줍니다.

 

 

writeToParcel에는 객체를 저장하는 코드를 작성해줍니다.

override fun writeToParcel(dest: Parcel?, flags: Int) {
    dest?.writeInt(number)
    dest?.writeString(name)
}

 

describeContents에서는 0 값을 반환하도록 해줍니다.

override fun describeContents(): Int {
    return 0
}

 

위의 설명까지 구현을 해도 오류가 뜰 것입니다. CREATOR을 생성하지 않아서입니다.

 

코틀린에서는 static이 없기 때문에 companion object를 사용하여 구현을 해주면 됩니다.

 

companion object {
    @JvmField
    val CREATOR : Parcelable.Creator<ParcelableClass> = object : Parcelable.Creator<ParcelableClass> {

        override fun createFromParcel(source: Parcel?): ParcelableClass {
            val data = ParcelableClass()
            data.number = source?.readInt()!!
            data.name = source.readString()

            return data
        }
            
        override fun newArray(size: Int): Array<ParcelableClass?> {
            return arrayOfNulls<ParcelableClass>(size)
        }
    }
}

 

JVM에서 직접 사용하기 위해서 @JvmField를 붙여주었습니다.

CREATOR은 정해진 이름이라서 CREATOR 그대로 만들어줘야 합니다.

Parcelable.Creator<ParcelableClass>를 상속받게 하고 함수들을 오버라이드 해줍니다.

 

 

createFromParcel에서는 객체를 읽어오는 코드를 작성하면 됩니다.

override fun createFromParcel(source: Parcel?): ParcelableClass {
    val data = ParcelableClass()
    data.number = source?.readInt()!!
    data.name = source.readString()

    return data
}

 

newArray에서는 array를 반환해주면 됩니다.

 

override fun newArray(size: Int): Array<ParcelableClass?> {
    return arrayOfNulls<ParcelableClass>(size)
}

arrayOfNulls를 사용하여 반환해 주었습니다.

 

 

 

사용하기

현재 액티비티에서 다른 액티비티로 객체를 전달하는 예제입니다.

 

 

아래와 같이 작성을 하여 객체를 저장한 후 다른 액티비티로 전달해주었습니다.

val data = ParcelableClass()
data.number = 7
data.name = "ImLeaf"

val intent = Intent(this, MainActivity2::class.java)
intent.putExtra("data", data)
startActivity(intent)

 

다른 액티비티에서는 아래와 같이 사용하여 값을 받아오고 적용하였습니다.

val data = intent.getParcelableExtra<ParcelableClass>("data")

number.text = data?.number.toString()
name.text = data?.name

 

 

실행 결과는 아래와 같습니다.

 

반응형

'알려주는 이야기 > 안드로이드' 카테고리의 다른 글

안드로이드 Intent Action 사용하기  (0) 2020.08.21
안드로이드 다른 앱 실행하기  (5) 2020.08.21
안드로이드 AsyncTask  (0) 2020.08.20
안드로이드 Handler  (0) 2020.08.20
안드로이드 Thread  (0) 2020.08.20
댓글