支持多个后退栈

导航组件与 Android 操作系统协作,在用户在您的应用中导航时维护 后退栈。在某些情况下,同时维护多个后退栈可能会有所帮助,用户可以在它们之间来回移动。例如,如果您的应用包含 底部导航导航抽屉,多个后退栈支持允许您的用户在您的应用中自由地在流程之间切换,而不会丢失他们在任何流程中的位置。

导航组件提供 API,通过在您的 导航图 中保存和恢复目的地的状态,支持多个后退栈。 NavigationUI 类包含自动处理此操作的方法,但您也可以手动使用底层 API 以获得更自定义的实现。

使用 NavigationUI 自动实施支持

NavigationUI 类包含 API,这些 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 实例还是使用 NavOptions.Builder,都是如此。

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

其他资源

要了解有关使用导航组件支持多个后退栈的更多信息,请参阅以下其他资源

博客文章

示例