O componente Navigation funciona com o sistema operacional Android para manter a backstack conforme o usuário navega pelo app. Em alguns casos, pode ser útil manter várias backstacks ao mesmo tempo, com o usuário se movendo entre elas. Por exemplo, se o app incluir uma navegação na parte de baixo da tela ou uma gaveta de navegação, o suporte a várias backstacks vai permitir que os usuários alternem livremente entre os fluxos do app sem se perder.
O componente Navigation fornece APIs com suporte a várias backstacks
ao salvar e restaurar o estado dos destinos no gráfico
de navegação. A classe
NavigationUI
inclui
métodos que processam tudo isso automaticamente, mas também é possível usar as APIs
manualmente para personalizar a implementação.
Implementar o suporte automaticamente com a NavigationUI
A classe NavigationUI
inclui APIs que salvam e restauram automaticamente o estado dos itens de menu conforme
o usuário navega entre eles. Por padrão, essas APIs implementam o suporte a várias backstacks
nos seguintes casos:
- Ao usar a sobrecarga adequada de
setupWithNavController()
para associar uma instância deNavigationView
ouBottomNavigationView
a uma instância deNavController
, conforme descrito em Adicionar uma gaveta de navegação ou Navegação na parte de baixo da tela. - Ao usar
onNavDestinationSelected()
para criar uma IU de menu de navegação vinculada a destinos hospedados por uma instânciaNavController
.
Essas APIs não exigem mais mudanças de código para implementar o suporte a várias backstacks e são a maneira recomendada de oferecer suporte a várias backstacks no app.
Implementar o suporte manualmente com APIs
Se os elementos fornecidos pela NavigationUI
não atenderem aos seus requisitos, você
vai poder usar as APIs para salvar e restaurar backstacks por uma das
outras superfícies da API do componente Navigation.
XML de navegação
No XML de navegação, os elementos <action>
no gráfico de navegação podem usar o
atributo app:popUpToSaveState
para salvar o estado de todos os destinos que a
ação abriu usando app:popUpTo
. Eles também podem usar o atributo app:restoreState
para restaurar qualquer estado salvo anteriormente para o destino definido no
atributo app:destination
.
Você pode usar esses atributos para oferecer suporte a várias backstacks. Quando uma ação
de navegação precisa mover o usuário de uma backstack para outra, defina
app:popUpToSaveState
e app:restoreState
como true
no elemento
<action>
correspondente. Dessa forma, a ação salva o estado da backstack
atual e restaura o estado da backstack de destino salvo
anteriormente, se houver.
O exemplo a seguir mostra uma ação que usa esses dois atributos:
<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
A classe NavOptions
permite que você transmita opções de navegação especiais para salvar e restaurar backstacks
ao navegar usando um NavController
. Isso ocorre independentemente de você criar sua
instância de NavOptions
usando a DSL
do Kotlin ou o
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);
Para saber mais sobre a transmissão de opções de navegação, consulte Aplicar NavOptions de maneira programática.
Outros recursos
Para saber mais sobre o suporte a várias backstacks no componente Navigation, consulte os seguintes recursos extras:
Postagens do blog (em inglês)
- MAD Skills: Navigation em várias backstacks no Medium
- Navigation: análise detalhada do suporte a várias backstacks no Medium
Exemplos (em inglês)
- App Now in Android no GitHub
- Jetnews no GitHub
- Jetsnack no GitHub