Die Navigationskomponente unterstützt das Android-Betriebssystem, um den Back-Stack zu verwalten, während der Nutzer in Ihrer App navigiert. In einigen Fällen kann es hilfreich sein, mehrere Back Stacks gleichzeitig zu verwalten, wobei der Nutzer zwischen ihnen hin- und herwechseln kann. Wenn Ihre App beispielsweise eine Navigation am unteren Rand oder eine Navigationsleiste umfasst, können Nutzer mithilfe mehrerer Backstacks in Ihrer App beliebig zwischen Abläufen wechseln, ohne dass sie an einer Stelle verloren gehen.
Die Navigationskomponente bietet APIs, die mehrere Back-Stacks unterstützen. Dazu wird der Status der Ziele in Ihrem Navigationsdiagramm gespeichert und wiederhergestellt. Die Klasse NavigationUI
enthält Methoden, die dies automatisch verarbeiten. Sie können aber auch die zugrunde liegenden APIs manuell verwenden, um eine individuellere Implementierung zu erreichen.
Unterstützung automatisch mit NavigationUI implementieren
Die Klasse NavigationUI
enthält APIs, mit denen der Status von Menüelementen automatisch gespeichert und wiederhergestellt wird, wenn der Nutzer zwischen ihnen wechselt. Diese APIs implementieren standardmäßig mehrere Back-Stack-Unterstützung in den folgenden Fällen:
- Wenn Sie die entsprechende Überlastung von
setupWithNavController()
verwenden, um eine Instanz vonNavigationView
oderBottomNavigationView
mit einerNavController
-Instanz zu verknüpfen, wie unter Navigationsleiste hinzufügen oder Navigation unten beschrieben. - Wenn Sie mit
onNavDestinationSelected()
eine benutzerdefinierte Navigationsmenü-UI erstellen, die mit Zielen verknüpft ist, die von einerNavController
-Instanz gehostet werden.
Für diese APIs sind keine weiteren Codeänderungen erforderlich, um mehrere Back-Stacks zu implementieren. Wir empfehlen, mehrere Back-Stacks in Ihrer Anwendung zu unterstützen.
Unterstützung manuell mit zugrunde liegenden APIs implementieren
Wenn die von NavigationUI
bereitgestellten Elemente Ihre Anforderungen nicht erfüllen, können Sie die zugrunde liegenden APIs zum Speichern und Wiederherstellen von Back-Stacks über eine der anderen API-Oberflächen verwenden, die von der Navigationskomponente bereitgestellt werden.
Navigations-XML
In der Navigations-XML-Datei können <action>
-Elemente in Ihrem Navigationsdiagramm das Attribut app:popUpToSaveState
verwenden, um den Status aller Ziele zu speichern, die bei der Aktion mit app:popUpTo
ausgelöst wurden. Außerdem können sie mit dem Attribut app:restoreState
jeden zuvor gespeicherten Status für das im Attribut app:destination
definierte Ziel wiederherstellen.
Sie können diese Attribute verwenden, um mehrere Back-Stacks zu unterstützen. Wenn Nutzer mit einer Navigationsaktion von einem Back-Stack in einen anderen verschoben werden müssen, setzen Sie im entsprechenden <action>
-Element sowohl app:popUpToSaveState
als auch app:restoreState
auf true
. Auf diese Weise speichert die Aktion den Status des aktuellen Back-Stacks und stellt gleichzeitig den zuvor gespeicherten Status des Ziel-Back-Stacks wieder her, falls vorhanden.
Das folgende Beispiel zeigt eine Aktion, bei der diese beiden Attribute verwendet werden:
<action
android:id=”@+id/swap_stack”
app:destination=”@id/second_stack”
app:restoreState=”true”
app:popUpTo=”@id/first_stack_start_destination”
app:popUpToSaveState=”true” />
Navigationsoptionen
Mit der Klasse NavOptions
können Sie spezielle Navigationsoptionen zum Speichern und Wiederherstellen von Back-Stacks übergeben, wenn Sie mit einem NavController
navigieren. Dies gilt unabhängig davon, ob Sie die Instanz von NavOptions
mit Kotlin-DSL oder mit NavOptions.Builder
erstellen:
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);
Weitere Informationen zum Übertragen von Navigationsoptionen finden Sie unter NavOptions programmatisch anwenden.
Weitere Informationen
Weitere Informationen zur Unterstützung mehrerer Back-Stacks mit der Navigationskomponente finden Sie in den folgenden zusätzlichen Ressourcen:
Blogposts
- MAD Skills: Navigation in mehreren Back-Stacks auf Medium
- Navigation: Mehrere Back Stacks im Detail auf Medium
Produktproben
- Now in Android App auf GitHub
- Jetnews auf GitHub
- Jetsnack auf GitHub