使用导航操作和片段

您可以使用导航操作在片段之间建立连接。调用导航操作会将用户从一个目的地带到另一个目的地。本指南解释了什么是操作,并演示了如何创建和使用它们。

概述

每个操作都有一个唯一的 ID,并且可以包含其他属性,例如目的地。目的地定义了当用户触发操作时应用将用户带到的屏幕。操作还可以使用参数将数据从一个目的地传递到另一个目的地。

  • Safe Args:使用操作,您可以将资源 ID 替换为Safe Args 生成的操作,从而提供额外的编译时安全性。
  • 动画:您还可以对目的地之间的转换进行动画处理。有关更多信息,请参阅目的地之间动画转换

示例

使用<action>标签在导航图 XML 文件中定义操作。以下代码片段实现了一个操作,该操作表示从FragmentAFragmentB的转换。

<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_winnergame_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>