はじめに
Androidアプリ開発では、フラグメントやアクティビティ間で値を受け渡すときに Bundle を使います。
Bundle にはデフォルトで String や Int などの一般的な型しか入れられず、自作クラスは Parcelable を継承したクラスでないと入れられません。
今回はかんたんに Parcelable を継承したクラスを実装する方法を紹介します。
環境
- Kotlin:1.3.61
Parcelable を継承したクラスの実装方法
実装方法は大きく3パターンあります。
「① > ② > ③」の順でオススメです。
① @Parcelize を使う
Kotlin 1.1で追加された @Parcelize アノテーションを使います。
渡したい data class に @Parcelize アノテーションを付け、 Parcelable を継承することで、自動的に Parcelable を継承したクラスが生成されます。
+ import android.os.Parcelable
+ import kotlinx.android.parcel.Parcelize
+ @Parcelize
data class MonsterEntity(
val name: String,
val description: String,
val iconUrlString: String,
+ ) : Parcelable
②サードパーティ製のライブラリを使う
Kotlin 1.1未満、または何らかの理由で @Parcelize アノテーションが使えない場合、サードパーティ製のライブラリを使うことを検討します。
私は使ったことがないですが、Parcelerというライブラリが有名です。
③ Parcelable を継承したクラスを自作する
自前で実装するのは手間ですが、 Parcelable を継承したクラスを自作する方法も考えられます。
私は自作したことがないので方法は省略します。
Parcelable クラスを Bundle に入れる方法
実装した Parcelable クラスは、 Bundle#putParcelable() メソッドで Bundle に入れられます。
private const val MONSTER_ARG_PARAM = "monster"
class MonsterDetailFragment : Fragment() {
companion object {
@JvmStatic
fun newInstance(monster: MonsterEntity) =
MonsterDetailFragment().apply {
arguments = Bundle().apply {
putParcelable(MONSTER_ARG_PARAM, monster)
}
}
}
}
おわりに
これでフラグメントやアクティビティ間でかんたんに自作クラスを受け渡せます!
Navigationを使っている場合、 Bundle に入れて渡すより、Safe Argsを使って渡すのがオススメです。