みなさまこんにちは〜!
メモリアインクのすだです。
本日は、
Navigation ComponentのSafe Argsを使用して
画面遷移&データの受け渡しをする方法を
実際のコードを利用して徹底解説していきます!
この記事を読んでわかること…
・Navigation Component と Safe Args について
・Safe Args を使って画面遷移&データを受け渡す方法
環境
- Kotlin (ver 1.9.0)
- Android Studio (Giraffe | 2022.3.1 Patch 3)
Navigation Component と Safe Args について
Navigation Componentについては、以下の記事で詳しくご紹介しております。
ぜひ合わせてご覧ください!
Navigation Componentを利用した画面遷移において、より安全に画面遷移したいor引数を渡したい場合は
Safe Argsを使うと とても便利です。
Safe Argsは、Navigation Component に含まれている機能で、
画面遷移時に型安全にデータを渡すための仕組みです。
従来の手動で Bundle
を渡す方法では、型やキー名のミスが発生しやすいという課題がありましたが、
Safe Args を使うことで、以下のメリットがあります。
- 型安全にデータを渡せる。
- コンパイル時にエラーを検出できる。
- コードの見通しが良くなり、保守性が向上する。
Safe Args の導入
build.gradle.kts
(モジュールレベル)に Safe Args のプラグインを追加してください。
plugins {
id("androidx.navigation.safeargs.kotlin")
}
Safe Argsを使用して画面遷移&データの受け渡しを行う実装方法
それでは早速実装していきましょう!HomeFragment
とDetailFragment
という2つのFragmentを用意して
すでに ナビゲーショングラフ(NavGraph)は作成済みであるとします。
引数を渡すには、以下の手順を踏んでいきます。
1. nav_graph.xml の <fragment> に <argument> を追加
例えば、HomeFragment
からDetailFragment
に userId
を渡す場合は
nav_graph.xmlに<argument>タグを以下のように追加してください。
<fragment
android:id="@+id/detailFragment"
android:name="com.example.app.DetailFragment">
<argument
android:name="userId"
app:argType="int"
android:defaultValue="0"/>
</fragment>
android:name="userId"
は引数の名前app:argType="int"
は引数の型android:defaultValue="0"
は引数が渡されなかった場合のデフォルト値
上記をそれぞれ指定します。
(デフォルト値がある場合、引数が渡されなくてもエラーにはなりません。)
2. HomeFragment から DetailFragment へデータを渡す
そして、HomeFragment内で、引数を以下のようにセットします。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
view.findViewById<Button>(R.id.buttonToDetail).setOnClickListener {
// Safe Args で遷移アクションを作成(userId を渡す)
val action = HomeFragmentDirections.actionHomeToDetail(userId = 123)
// NavController を使って画面遷移を実行
findNavController().navigate(action)
}
}
HomeFragmentDirections.actionHomeToDetail
はSafe Args によって自動生成されたクラスのメソッド で、HomeFragment
から DetailFragment
に遷移する際に データを渡すためのオブジェクト を作成するものです。
引数がなくても(ただの画面遷移でも)Safe Argsを使用して問題ありません。
val action = HomeFragmentDirections.actionHomeToDetail() // 引数なし
findNavController().navigate(action)
この場合でも、HomeFragmentDirections.actionHomeToDetail()
という遷移オブジェクトが生成されるので、型安全に遷移できます。
3. DetailFragmentでデータを受け取る
画面遷移時にDetailFragmentでデータを受け取るために、以下のように実装してください。
class DetailFragment : Fragment(R.layout.fragment_detail) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Safe Args を使って引数を取得
val args: DetailFragmentArgs by navArgs()
val userId = args.userId
// 以下処理は自由に
view.findViewById<TextView>(R.id.textViewUserId).text = "User ID: $userId"
}
}
val args: DetailFragmentArgs by navArgs()
は、
Safe Args によって自動生成された DetailFragmentArgs
クラスのインスタンスを取得する処理です。
「args.引数名 」で、渡したデータを受け取ることができます。
複数の引数を渡す方法
Safe Args では複数の引数を渡すことができます。
以下は userId
と userName
の 2 つの引数を渡す例です。
<fragment
android:id="@+id/detailFragment"
android:name="com.example.app.DetailFragment">
<argument
android:name="userId"
app:argType="int" />
<argument
android:name="userName"
app:argType="string" />
</fragment>
まとめ
おつかれさまでした。いかがでしたでしょうか!
Navigation Componentでの画面遷移はSafe Argsを使うことで、
より安全かつ簡単にデータの受け渡しを行うことができます。
ぜひアプリ画面の実装に、役立ててくださいね〜!
技術者としてのキャリアパスを次のレベルへと進めたい皆様、
未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】
自分の市場価値をさらに向上させてみませんか?
コメント