导航组件与 Android 操作系统协同工作,在用户导航您的应用时维护返回堆栈。在某些情况下,同时维护多个返回堆栈,让用户在它们之间来回切换可能会很有用。例如,如果您的应用包含底部导航或导航抽屉式菜单,则多个返回堆栈支持允许您的用户在应用中的不同流程之间自由切换,而不会丢失任何流程中的位置。
导航组件提供了 API,通过保存和恢复导航图中目标的状态来支持多个返回堆栈。NavigationUI
类包含自动处理此问题的方法,但您也可以手动使用底层 API 进行更自定义的实现。
使用 NavigationUI 自动实现支持
NavigationUI
类包含 API,可在用户在菜单项之间移动时自动保存和恢复菜单项的状态。在以下情况下,这些 API 默认实现多个返回堆栈支持:
- 当您使用
setupWithNavController()
的适当重载将NavigationView
或BottomNavigationView
实例与NavController
实例关联时,如添加导航抽屉式菜单或底部导航中所述。 - 当您使用
onNavDestinationSelected()
创建与NavController
实例托管的目标关联的自定义导航菜单 UI 时。
这些 API 无需进一步的代码更改即可实现多个返回堆栈支持,是您应用中支持多个返回堆栈的推荐方式。
使用底层 API 手动实现支持
如果 NavigationUI
提供的元素不满足您的要求,您可以使用底层 API,通过导航组件提供的其他 API 表面之一来保存和恢复返回堆栈。
导航 XML
在导航 XML 中,导航图中的 <action>
元素可以使用 app:popUpToSaveState
属性来保存操作使用 app:popUpTo
弹出的任何目标的状态。它们还可以使用 app:restoreState
属性来恢复 app:destination
属性中定义的目标的任何先前保存的状态。
您可以使用这些属性来支持多个返回堆栈。当导航操作需要将用户从一个返回堆栈移动到另一个返回堆栈时,在相应的 <action>
元素中将 app:popUpToSaveState
和 app: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
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。
其他资源
要了解有关导航组件中多个返回堆栈支持的更多信息,请参阅以下其他资源: