はじめに
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を使って渡すのがオススメです。