티스토리 뷰
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 |