Компонент навигации работает с операционной системой Android, чтобы поддерживать обратный стек, когда пользователь перемещается по приложению. В некоторых случаях может быть полезно поддерживать несколько обратных стеков одновременно, чтобы пользователь мог перемещаться между ними. Например, если в вашем приложении есть нижняя панель навигации или боковое меню, поддержка нескольких обратных стеков позволит пользователям свободно переключаться между разделами приложения, не теряя прогресс ни в одном из них.
Компонент Navigation предоставляет API, которые поддерживают несколько обратных стеков, сохраняя и восстанавливая состояние пунктов назначения в вашем графе навигации. Класс NavigationUI включает методы, которые обрабатывают это автоматически, но вы также можете использовать базовые API вручную для более индивидуальной реализации.
Как реализовать поддержку автоматически с помощью NavigationUI
Класс NavigationUI включает API, которые автоматически сохраняют и восстанавливают состояние пунктов меню, когда пользователь перемещается между ними. Эти API по умолчанию реализуют поддержку нескольких обратных стеков в следующих случаях:
- Если вы используете подходящую перегрузку
setupWithNavController(), чтобы связать экземплярNavigationViewилиBottomNavigationViewс экземпляромNavController, как описано в разделе Добавление панели навигации или Нижняя панель навигации. - Когда вы используете
onNavDestinationSelected(), чтобы создать специальное меню навигации, связанное с целевыми страницами, размещенными в экземпляреNavController.
Эти API не требуют дополнительных изменений кода для реализации поддержки нескольких обратных стеков и являются рекомендуемым способом поддержки нескольких обратных стеков в вашем приложении.
Как реализовать поддержку вручную с помощью базовых API
Если элементы, предоставляемые NavigationUI, не соответствуют вашим требованиям, вы можете использовать базовые API для сохранения и восстановления обратных стеков через одну из других поверхностей API, предоставляемых компонентом навигации.
XML-файл навигации
В XML-файле Navigation элементы <action> в графе навигации могут использовать атрибут app:popUpToSaveState, чтобы сохранять состояние любых пунктов назначения, которые действие извлекло с помощью app:popUpTo. Они также могут использовать атрибут app:restoreState, чтобы восстановить любое ранее сохраненное состояние для целевого объекта, определенного в атрибуте app:destination.
Эти атрибуты можно использовать для поддержки нескольких обратных стеков. Если при навигации пользователь должен перейти из одного обратного стека в другой, задайте для app:popUpToSaveState и app:restoreState значение true в соответствующем элементе <action>. Таким образом, действие сохраняет состояние текущего обратного стека, а также восстанавливает ранее сохраненное состояние целевого обратного стека, если оно существует.
В примере ниже показано действие, в котором используются оба этих атрибута:
<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. Это правило действует независимо от того, создаете ли вы экземпляр NavOptions с помощью Kotlin DSL или 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);
Подробнее о том, как передавать параметры навигации…
Дополнительные ресурсы
Чтобы узнать больше о поддержке нескольких обратных стеков с помощью компонента Navigation, ознакомьтесь со следующими дополнительными материалами:
Записи в блоге
- MAD Skills: Navigation multiple back stacks on Medium
- Navigation: Multiple Back Stacks deep dive on Medium
Образцы
- Приложение Now in Android на GitHub.
- Jetnews на GitHub
- Jetsnack на GitHub