ナビゲーション アクションとフラグメントを使用する

ナビゲーション アクションを使用して、フラグメント間の接続を作成できます。ナビゲーション アクションを呼び出すと、ユーザーが別のデスティネーションに移動します。このガイドでは、アクションの概要と、アクションを作成して使用する方法について説明します。

概要

各アクションには一意の ID があり、デスティネーションなどの追加の属性を含めることができます。デスティネーションでは、アクションがトリガーされたときにアプリでユーザーを移動させる画面を定義します。このアクションでは、引数を使用してデスティネーション間でデータを転送することもできます。

<action> タグを使用して、ナビゲーション グラフの XML ファイルでアクションを定義します。次のスニペットでは、FragmentA から FragmentB への遷移を表すアクションを実装しています。

<fragment
    android:id="@+id/fragmentA"
    android:name="com.example.FragmentA">
    <action
        android:id="@+id/action_fragmentA_to_fragmentB"
        app:destination="@id/fragmentB" />
</fragment>

このアクションを使用して移動するには、NavController.navigate() を呼び出して、アクションの id を渡します。

navController.navigate(R.id.action_fragmentA_to_fragmentB)

グローバルな操作

グローバル アクションを使用すると、どこからでもデスティネーションに移動できます。

複数のパスを介してアクセスできるアプリ内のデスティネーションに対して、そのデスティネーションに移動する、対応するグローバル アクションを定義します。

次の例をご覧ください。results_winner デスティネーションと game_over デスティネーションはどちらも、ホーム デスティネーションにポップアップする必要があります。action_pop_out_of_game アクションは、そのための機能を提供します。action_pop_out_of_game は、特定のフラグメントの外側にあるグローバル アクションです。つまり、in_game_nav_graph 内の任意の場所で参照して呼び出すことができます。

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:id="@+id/in_game_nav_graph"
   app:startDestination="@id/in_game">

   <!-- Action back to destination which launched into this in_game_nav_graph -->
   <action android:id="@+id/action_pop_out_of_game"
                       app:popUpTo="@id/in_game_nav_graph"
                       app:popUpToInclusive="true" />

   <fragment
       android:id="@+id/in_game"
       android:name="com.example.android.gamemodule.InGame"
       android:label="Game">
       <action
           android:id="@+id/action_in_game_to_resultsWinner"
           app:destination="@id/results_winner" />
       <action
           android:id="@+id/action_in_game_to_gameOver"
           app:destination="@id/game_over" />
   </fragment>

   <fragment
       android:id="@+id/results_winner"
       android:name="com.example.android.gamemodule.ResultsWinner" />

   <fragment
       android:id="@+id/game_over"
       android:name="com.example.android.gamemodule.GameOver"
       android:label="fragment_game_over"
       tools:layout="@layout/fragment_game_over" />

</navigation>