支持多个返回堆栈

导航组件与 Android 操作系统协同工作,在用户导航您的应用时维护返回堆栈。在某些情况下,同时维护多个返回堆栈,让用户在它们之间来回切换可能会很有用。例如,如果您的应用包含底部导航导航抽屉式菜单,则多个返回堆栈支持允许您的用户在应用中的不同流程之间自由切换,而不会丢失任何流程中的位置。

导航组件提供了 API,通过保存和恢复导航图中目标的状态来支持多个返回堆栈。NavigationUI 类包含自动处理此问题的方法,但您也可以手动使用底层 API 进行更自定义的实现。

使用 NavigationUI 自动实现支持

NavigationUI 类包含 API,可在用户在菜单项之间移动时自动保存和恢复菜单项的状态。在以下情况下,这些 API 默认实现多个返回堆栈支持:

这些 API 无需进一步的代码更改即可实现多个返回堆栈支持,是您应用中支持多个返回堆栈的推荐方式。

使用底层 API 手动实现支持

如果 NavigationUI 提供的元素不满足您的要求,您可以使用底层 API,通过导航组件提供的其他 API 表面之一来保存和恢复返回堆栈。

在导航 XML 中,导航图中的 <action> 元素可以使用 app:popUpToSaveState 属性来保存操作使用 app:popUpTo 弹出的任何目标的状态。它们还可以使用 app:restoreState 属性来恢复 app:destination 属性中定义的目标的任何先前保存的状态。

您可以使用这些属性来支持多个返回堆栈。当导航操作需要将用户从一个返回堆栈移动到另一个返回堆栈时,在相应的 <action> 元素中将 app:popUpToSaveStateapp:restoreState 都设置为 true。这样,该操作会保存当前返回堆栈的状态,同时如果目标返回堆栈存在,也会恢复其先前保存的状态。

以下示例显示了一个同时使用这两个属性的操作:

<action
  android:id=”@+id/swap_stack”
  app:destination=”@id/second_stack”
  app:restoreState=”true”
  app:popUpTo=”@id/first_stack_start_destination”
  app:popUpToSaveState=”true” />

NavOptions 类允许您在通过 NavController 导航时传递特殊的导航选项,以保存和恢复返回堆栈。无论是使用Kotlin DSL 还是使用 NavOptions.Builder 创建 NavOptions 实例,这都适用。

Kotlin

// Use the navigate() method that takes a navOptions DSL Builder
navController.navigate(selectedBottomNavRoute) {
  launchSingleTop = true
  restoreState = true
  popUpTo(navController.graph.findStartDestination().id) {
    saveState = true
  }
}

Java

NavOptions navOptions = new NavOptions.Builder()
  .setLaunchSingleTop(true)
  .setRestoreState(true)
  .setPopUpTo(NavGraph.findStartDestination(navController.getGraph()).getId(),
    false, // inclusive
    true) // saveState
  .build();
navController.navigate(selectedBottomNavId, null, navOptions);

要了解有关传递导航选项的更多信息,请参阅以编程方式应用 NavOptions

其他资源

要了解有关导航组件中多个返回堆栈支持的更多信息,请参阅以下其他资源:

博客文章

示例