导航组件与 Android 操作系统协作,在用户在您的应用中导航时维护 后退栈。在某些情况下,同时维护多个后退栈可能会有所帮助,用户可以在它们之间来回移动。例如,如果您的应用包含 底部导航 或 导航抽屉,多个后退栈支持允许您的用户在您的应用中自由地在流程之间切换,而不会丢失他们在任何流程中的位置。
导航组件提供 API,通过在您的 导航图 中保存和恢复目的地的状态,支持多个后退栈。 NavigationUI
类包含自动处理此操作的方法,但您也可以手动使用底层 API 以获得更自定义的实现。
使用 NavigationUI 自动实施支持
NavigationUI
类包含 API,这些 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
实例还是使用 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。
其他资源
要了解有关使用导航组件支持多个后退栈的更多信息,请参阅以下其他资源
博客文章
- MAD Skills: 导航多个后退栈 在 Medium 上
- 导航:深入了解多个后退栈 在 Medium 上
示例
- 现在在 Android 应用程序中 在 GitHub 上
- Jetnews 在 GitHub 上
- Jetsnack 在 GitHub 上