您可以使用导航操作在 Fragment 之间构建连接。调用导航操作会将用户从一个目标转到另一个目标。本指南介绍了什么是操作,并演示了如何创建和使用操作。
概览
每个操作都有一个唯一的 ID,并且可以包含其他属性,例如目标。目标定义了当用户触发操作时应用将用户带到的屏幕。操作还可以使用参数将数据从一个目标传递到另一个目标。
- Safe Args:使用操作,您可以用Safe Args 生成的操作替换资源 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
是任何特定 Fragment 之外的全局操作。这意味着您可以在 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>