どうも。どっことです。今回はParcelable
の実装方法について解説します。
Parcelableを実装する
Activity
やFragment
などの画面間におけるデータ受け渡しはアプリ全体の動きを考える上でなくてはならない処理ですが、自前で用意したデータクラスはそのままだとBundle
に乗せることができません。
それではどうするかというと、そのデータクラスにParcelable
やSerializable
を実装します。取り出すときにキャストが必要にはなるが、これでBundle
に乗せることができるようになり画面間のデータ受け渡しができるようになります。
今回はその呪文の如きParcelable
のインターフェース群の実装について、説明します。
実装
必要な実装ですが、データクラスに以下のクラス・メソッドを実装します。
Parcelable
を実装する
describeContents
を実装する
- 引数が
Parcel
のコンストラクタを実装する
writeToParcel()
を実装する
CREATOR : Parcelable.Creator
を実装する
サンプルとしてItem
クラスにParcelable
を実装する場合は以下となります。
data class Item(
var title: String,
var description: String,
) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readString()!!,
parcel.readString()!!
)
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(title)
parcel.writeString(description)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<Item> {
override fun createFromParcel(parcel: Parcel): Item {
return Item(parcel)
}
override fun newArray(size: Int): Array<Item?> {
return arrayOfNulls(size)
}
}
}
あとは実装したデータクラスのオブジェクトをBundle#putParcelable()
でBundle
に詰め
val bundle = Bundle().apply {
putSerializable("適当なキー", item)
}
Bundle#getParcelable()
でBundle
から取り出すことで
val item = bundle.getParcelable("適当なキー", Item::class.java)
画面間でデータクラスをやり取りすることができます。
ここまで書いててですが…
Percelableをいい感じに実装してくれるアノテーションがあると公式サイトが謳っていました。
Parcelable 実装生成ツール
アノテーション付けるだけで上記の面倒臭い実装をしなくてよくなるなんて、なんて素晴らしいんだ!!ありがとうGoogle様!!!
まとめ
今回はParcelable
の実装方法について解説しました。ボイラープレートなParcelable
の実装ですが、すでに自動生成してくれるツールがあるので、そちらを使う方が無難でしょう。今回の紹介した内容がほぼ無用なものになってしまいますが、必要なものが簡単に実装できることの方が重要だと思うので、まあ仕方ないでしょう笑