Компонент навигации работает с операционной системой Android, обеспечивая поддержку обратного стека при навигации пользователя по вашему приложению. В некоторых случаях может быть полезно одновременно поддерживать несколько обратных стеков , при этом пользователь перемещается между ними. Например, если ваше приложение включает нижнюю навигацию или панель навигации , поддержка нескольких обратных стеков позволяет вашим пользователям свободно переключаться между потоками в вашем приложении, не теряя своего места ни в одном из них.
Компонент навигации предоставляет API, которые поддерживают несколько обратных стеков, сохраняя и восстанавливая состояние пунктов назначения в графе навигации . Класс NavigationUI
включает методы, которые обрабатывают это автоматически, но вы также можете использовать базовые API вручную для более индивидуальной реализации.
Автоматическая реализация поддержки с помощью NavigationUI.
Класс NavigationUI
включает API, которые автоматически сохраняют и восстанавливают состояние пунктов меню, когда пользователь перемещается между ними. Эти API по умолчанию реализуют поддержку нескольких обратных стеков в следующих случаях:
- При использовании соответствующей перегрузки
setupWithNavController()
для связи экземпляраNavigationView
илиBottomNavigationView
с экземпляромNavController
, как описано в разделе Добавление панели навигации или нижней навигации . - Когда вы используете
onNavDestinationSelected()
для создания пользовательского интерфейса пользовательского меню навигации , привязанного к пунктам назначения, размещенным в экземпляреNavController
.
Эти API не требуют дополнительных изменений кода для реализации поддержки нескольких обратных стеков и являются рекомендуемым способом поддержки нескольких обратных стеков в вашем приложении.
Реализуйте поддержку вручную с помощью базовых API.
Если элементы, предоставляемые NavigationUI
не удовлетворяют вашим требованиям, вы можете использовать базовые API для сохранения и восстановления обратных стеков через одну из других поверхностей API, предоставляемых компонентом навигации.
Навигационный XML
В XML-коде навигации элементы <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
позволяет передавать специальные параметры навигации для сохранения и восстановления обратных стеков при навигации с помощью NavController
. Это справедливо независимо от того, создаете ли вы экземпляр NavOptions
с помощью Kotlin DSL или с помощью NavOptions.Builder
:
Котлин
// Use the navigate() method that takes a navOptions DSL Builder navController.navigate(selectedBottomNavRoute) { launchSingleTop = true restoreState = true popUpTo(navController.graph.findStartDestination().id) { saveState = true } }
Ява
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: навигация по нескольким стопкам на Medium
- Навигация: глубокое погружение в несколько Back Stacks на Medium
Образцы
- Теперь в приложении для Android на GitHub
- Джетньюс на GitHub
- Джетснак на GitHub