【正社員】還元率83%【フリーランス】マージン一律5万円で案件をご紹介させていただきます。 詳細はこちら

【Android】<Kotlin>Navigation ComponentのSafe Argsを使用して型安全な画面遷移&データ受け渡しを実現する方法!

【Android】<Kotlin>Navigation ComponentのSafe Argsを使用して型安全な画面遷移&データ受け渡しを実現する方法!
すだ

みなさまこんにちは〜!
メモリアインクのすだです。

本日は、
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を使用して画面遷移&データの受け渡しを行う実装方法

それでは早速実装していきましょう!
HomeFragmentDetailFragmentという2つのFragmentを用意して
すでに ナビゲーショングラフ(NavGraph)は作成済みであるとします。

引数を渡すには、以下の手順を踏んでいきます。

1. nav_graph.xml の <fragment> に <argument> を追加

例えば、HomeFragmentからDetailFragmentuserId を渡す場合は
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.actionHomeToDetailSafe 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 では複数の引数を渡すことができます。
以下は userIduserName の 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エンジニアを目指すなら【ユニゾンキャリア】
を通じて、
自分の市場価値をさらに向上させてみませんか?

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

弊社テックブログをご愛読いただきありがとうございます。
当テックブログを運用している株式会社メモリアインクは、
【正社員】還元率83%
【フリーランス】マージン一律5万円で案件のご紹介
と、エンジニアの皆様に分かりやすい形で稼げる仕組みを構築し提供させていただいております。

コメント

コメントする

目次