8
6

More than 3 years have passed since last update.

Parcelableを継承したクラスを実装する方法(Kotlin)

Last updated at Posted at 2020-04-17

はじめに

Androidアプリ開発では、フラグメントやアクティビティ間で値を受け渡すときに Bundle を使います。
Bundle にはデフォルトで StringInt などの一般的な型しか入れられず、自作クラスは Parcelable を継承したクラスでないと入れられません。

今回はかんたんに Parcelable を継承したクラスを実装する方法を紹介します。

環境

  • Kotlin:1.3.61

Parcelable を継承したクラスの実装方法

実装方法は大きく3パターンあります。
「① > ② > ③」の順でオススメです。

@Parcelize を使う

Kotlin 1.1で追加された @Parcelize アノテーションを使います。
渡したい data class@Parcelize アノテーションを付け、 Parcelable を継承することで、自動的に Parcelable を継承したクラスが生成されます。

MonsterEntity.kt
+ 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 に入れられます。

MonsterDetailFragment.kt
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を使って渡すのがオススメです。

参考リンク

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6