LoginSignup
10
9

More than 3 years have passed since last update.

AndroidX Navigation SafeArgs で List を引数として渡す (Array として渡す方法追記)

Last updated at Posted at 2018-10-25

2020/12/31 追記:
AndroidX Navigation SafeArgs 1.0.0-alpha08 からは、配列として引数を渡すことが可能になりました。

<argument
    android:name="items"
    app:argType="string[]"/>

プリミティブ型も Parcelable/Serializable もすべて上記の記述で Array となります。

Array として渡して、 受け取り側で List へ変換して使う形が良さそうです。
もともとのこの記事の方法で List を渡すこともできますが、 Parcelable な List に変換する手間がかかるため、Array を使う場合に比べて優位性はそこまでありません。


元記事:

AndroidX Navigation SafeArgs では List は引数として使えませんが、
Parcelable なクラスであれば使うことができます。

List を引数として使うときは @Parcelize と組み合わせます。

Parcelize を使う設定

2020/12/31追記:
https://developer.android.com/kotlin/parcelize
https://developers-jp.googleblog.com/2020/11/the-future-of-kotlin-android-extensions.html
https://blog.jetbrains.com/ja/kotlin/2020/11/kotlin-1-4-20-released-ja/

Kotlin 1.4.20 からは Android Extensions は非推奨となり、 kotlin-parcelize プラグインを使うようになりました。

kotlin-parcelize を読み込めば使えるようになります。

build.gradle.kts

plugins {
    ..
    id("kotlin-parcelize")
}

build.gradle.kts にて androidExtensions.experimental = true の設定は不要です

引数クラスの定義

任意のパッケージで以下のような ArrayList を継承したクラスを定義します。
このクラスが Parcelable に対応します。

もちろん Hoge クラスも Parcelable であることが前提です。

@Parcelize
class HogeList(val list: List<Hoge>) : ArrayList<Hoge>(list), Parcelable

Navigation XML の設定

argType を指定します。

<activity
    android:id="@+id/HogeActivity"
...
    tools:layout="@layout/activity_hoge">
        <argument
            android:name="hoge"
            app:argType="com.example.hoge.HogeActivity.HogeList"/>

引数の生成

引数を渡すときに、Parcelable なクラスに変換して、引数として使います。

HogeActivityArgs.Builder(HogeActivity.HogeList(list)).build()
10
9
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
10
9