Navigation SafeArgsで使える型

Kenji Abe
Kenji Abe
Feb 21 · 4 min read

Navigation Componentの便利な機能としてSafeArgsがあります。

SafeArgsはGUIでも設定できるのですが、GUIからは設定できないが使用できる型があります。

SafeArgsの型の指定についてまとめておきます。

環境

  • Android Studio 3.3.1
  • Navigation 1.0.0-beta02

integer, long, boolean, string

これらはGUIからも設定できるので特に説明はいらないかなと思います。

float

GUIから設定できない基本型として、floatがあります。こちらを使いたい場合はXMLに直接設定する必要があります。

<fragment>
<argument
android:name="id"
app:argType="float" />
</fragment>

使えそうで、使えない

double, short, byte, charはビルド時にエラーになって使えません。

reference

GUIからだと、 Resource Reference になります。これちょっと分かりにくいんですが、 内部的にはただのintで、R.string.hoge等を引数にするときに使います。

また、Default Valueとして、 @string/app_name のような指定が可能です。

Parcelable

GUIからだと、 Custom Parcelable... からParcelableを実装してるクラスを選択できます。

XMLで直接設定もできます。このとき . から開始することで、アプリのパッケージ名を省略することが可能です。

<fragment>
<argument
android:name="data"
app:argType=".Data" />
</fragment>

enum

enumはGUIからは設定できませんが、XMLに直接記述することで使用可能です。また、Default Valueにもenum値を設定できます。

<fragment>
<argument android:name="type"
app:argType=".Type"
android:defaultValue="NORTH"/>
</fragment>

Nested/Inner class

Nested/Inner class(Parcelable, Serializable)も指定できます。 $ を使うだけです。

<fragment>
<argument android:name="nested"
app:argType=".Data$Nested"/>
</fragment>

配列

argType の型指定の末尾に [] をつけると配列として扱ってくれます。

<fragment>
<argument android:name="ids"
app:argType="integer[]" />
</fragment>

配列の場合はDefault Valueが指定できません。

無指定

最後に argType を指定しない場合です。GUIだと <inferred type> です。

この場合は string と同じ扱いになります。

<fragment>
<argument android:name="inferred" />
</fragment>
Kenji Abe

Written by

Kenji Abe

Programmer / Gamer

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade