Prendre en charge plusieurs piles "Retour"

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 :

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.

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” />

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

Exemples