Le composant Navigation fonctionne avec le système d'exploitation Android afin de maintenir la pile "Retour" lorsque l'utilisateur navigue dans votre application. Dans certains cas, il peut être utile de gérer simultanément plusieurs piles "Retour", l'utilisateur passant d'une pile à l'autre. Par exemple, si votre application inclut une navigation inférieure ou un panneau de navigation, la prise en charge de plusieurs piles "Retour" permet aux utilisateurs de basculer librement entre les différents flux de votre application sans perdre leur place dans le moindre d'entre eux.
Le composant Navigation fournit des API compatibles avec plusieurs piles "Retour" en enregistrant et en restaurant l'état des destinations dans votre graphique de navigation. La classe NavigationUI
inclut des méthodes qui gèrent cela automatiquement, mais vous pouvez également utiliser les API sous-jacentes manuellement pour une mise en œuvre plus personnalisée.
Implémenter la prise en charge automatiquement avec NavigationUI
La classe NavigationUI
inclut des API qui enregistrent et restaurent automatiquement l'état des éléments de menu à mesure que l'utilisateur passe de l'un à l'autre. Ces API implémentent la prise en charge de plusieurs piles "Retour" par défaut dans les cas suivants :
- Lorsque vous utilisez la surcharge appropriée de
setupWithNavController()
pour associer une instance deNavigationView
ou deBottomNavigationView
à unNavController
, comme indiqué dans les sections Ajouter un panneau de navigation ou Navigation inférieure. - Lorsque vous utilisez
onNavDestinationSelected()
pour créer une interface utilisateur de menu de navigation personnalisée liée à des destinations hébergées par une instanceNavController
.
Ces API ne nécessitent aucune autre modification du code pour implémenter la prise en charge de plusieurs piles "Retour" et constituent la méthode recommandée pour la prise en charge de plusieurs piles "Retour" dans votre application.
Implémenter la prise en charge manuellement avec les API sous-jacentes
Si les éléments fournis par NavigationUI
ne répondent pas à vos exigences, vous pouvez utiliser les API sous-jacentes pour enregistrer et restaurer les piles "Retour" via l'une des autres plates-formes d'API fournies par le composant Navigation.
Fichier XML de navigation
Dans le fichier XML de navigation, les éléments <action>
de votre graphique de navigation peuvent utiliser l'attribut app:popUpToSaveState
pour enregistrer l'état de toutes les destinations que l'action a renvoyées à l'aide de app:popUpTo
. Ils peuvent également utiliser l'attribut app:restoreState
pour restaurer tout état précédemment enregistré pour la destination définie dans l'attribut app:destination
.
Vous pouvez vous servir de ces attributs pour accepter plusieurs piles "Retour". Lorsqu'une action de navigation doit déplacer l'utilisateur d'une pile "Retour" à une autre, définissez app:popUpToSaveState
et app:restoreState
sur true
dans l'élément <action>
correspondant. De cette manière, l'action enregistre l'état de la pile "Retour" actuelle, tout en restaurant l'état précédemment enregistré de la pile "Retour" de destination, le cas échéant.
L'exemple suivant montre une action qui utilise ces deux attributs :
<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
La classe NavOptions
vous permet de transmettre des options de navigation spéciales pour enregistrer et restaurer les piles "Retour" lorsque vous naviguez à l'aide d'un NavController
. Cela s'applique si vous créez votre instance de NavOptions
à l'aide du DSL Kotlin ou de 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);
Pour en savoir plus sur la transmission des options de navigation, consultez la section Appliquer NavOptions de façon programmatique.
Ressources supplémentaires
Pour en savoir plus sur la prise en charge de plusieurs piles "Retour" avec le composant Navigation, consultez les ressources supplémentaires suivantes :
Articles de blog
- MAD Skills: Navigation multiple back stacks (MAD Skills : navigation avec plusieurs piles "Retour") sur Medium
- Navigation: Multiple Back Stacks deep dive (Navigation : présentation détaillée de plusieurs piles "Retour") sur Medium
Exemples
- Now in Android app (Maintenant dans l'application Android) sur GitHub
- Jetnews sur GitHub
- Jetsnack sur GitHub