Il componente Navigazione funziona con il sistema operativo Android per mantenere lo stack back mentre l'utente naviga nell'app. In alcuni casi, potrebbe essere utile gestire più stack back contemporaneamente, con l'utente che si sposta avanti e indietro tra i due. Ad esempio, se la tua app include la navigazione in basso o un cassetto di navigazione, il supporto di più back stack consente agli utenti di passare liberamente da un flusso all'altro nell'app senza perdere il proprio posto in nessuno di essi.
Il componente Navigazione fornisce API che supportano più back stack mediante il salvataggio e il ripristino dello stato delle destinazioni nel grafico di navigazione. La classe NavigationUI
include metodi che gestiscono questo problema automaticamente, ma puoi anche utilizzare manualmente le API sottostanti per un'implementazione più personalizzata.
Implementa automaticamente il supporto con NavigationUI
La classe NavigationUI
include API che salvano e ripristinano automaticamente lo stato delle voci di menu quando l'utente si sposta da una all'altra. Queste API implementano per impostazione predefinita il supporto di più back stack nei seguenti casi:
- Quando utilizzi il sovraccarico appropriato di
setupWithNavController()
per associare un'istanza diNavigationView
oBottomNavigationView
a un'istanza diNavController
, come descritto in Aggiungere un riquadro di navigazione a scomparsa o Navigazione in basso. - Quando utilizzi
onNavDestinationSelected()
per creare un'UI del menu di navigazione personalizzata collegata alle destinazioni ospitate da un'istanzaNavController
.
Queste API non richiedono ulteriori modifiche al codice per implementare il supporto di più back stack e sono il metodo consigliato per supportare più back stack nell'app.
Implementa manualmente il supporto con le API sottostanti
Se gli elementi forniti da NavigationUI
non soddisfano i tuoi requisiti, puoi utilizzare le API sottostanti per salvare e ripristinare gli stack esistenti tramite una delle altre piattaforme API fornite dal componente Navigazione.
XML di navigazione
Nel file XML di navigazione, gli elementi <action>
nel grafico di navigazione possono utilizzare l'attributo app:popUpToSaveState
per salvare lo stato di qualsiasi destinazione selezionata dall'azione utilizzando app:popUpTo
. Possono inoltre utilizzare l'attributo app:restoreState
per ripristinare qualsiasi stato salvato in precedenza per la destinazione definita nell'attributo app:destination
.
Puoi utilizzare questi attributi per supportare più back stack. Quando un'azione di navigazione deve spostare l'utente da uno stack posteriore a un altro, imposta app:popUpToSaveState
e app:restoreState
su true
nell'elemento <action>
corrispondente. In questo modo, l'azione salva lo stato del back stack attuale, ripristinando anche lo stato salvato in precedenza del back stack di destinazione, se esistente.
L'esempio seguente mostra un'azione che utilizza entrambi gli attributi:
<action
android:id=”@+id/swap_stack”
app:destination=”@id/second_stack”
app:restoreState=”true”
app:popUpTo=”@id/first_stack_start_destination”
app:popUpToSaveState=”true” />
Opzioni di navigazione
Il corso NavOptions
consente di passare opzioni di navigazione speciali per salvare e ripristinare gli stack di riserva
quando navighi utilizzando un NavController
. Questo vale se crei la tua istanza di NavOptions
utilizzando la DSL Kotlin 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);
Per scoprire di più su come trasmettere le opzioni di navigazione, vedi Applicare NavOptions in modo programmatico.
Risorse aggiuntive
Per scoprire di più sul supporto di più back stack con il componente di navigazione, consulta le seguenti risorse aggiuntive:
Post del blog
- Abilità MAD: navigazione di più back stack su Media
- Navigazione: Approfondimento su Multiple Back Stacks su Medium
Samples
- Ora nell'app Android su GitHub
- Jetnews su GitHub
- Jetsnack su GitHub