NavController
enthält einen „Back Stack“ die die Ziele enthält,
besucht hat. Wenn Nutzende in Ihrer App zu Bildschirmen navigieren,
NavController
fügt dem Back Stack Ziele hinzu bzw. entfernt sie daraus.
Ein Stack ist ein „Last In, First Out“- Datenstruktur. Die
NavController
verschiebt Elemente daher an Elemente und platziert sie oben im
Stacks.
Grundlegendes Verhalten
Dies sind die wichtigsten Fakten über das Verhalten des Rückens Stapel:
- Erstes Ziel:Wenn der Nutzer die App öffnet, wird über die
NavController
schiebt das erste Ziel an die Spitze des Back-Stacks. - An den Stapel senden:Bei jedem Aufruf von
NavController.navigate()
wird eine Ziel an die Spitze des Stacks rücken. - Top-Ziel verschieben:Wenn Sie auf Nach oben oder Zurück tippen, wird die
NavController.navigateUp()
undNavController.popBackStack()
. Sie heben das oberste Ziel ab. Weitere Informationen finden Sie in der Grundsätze der Navigation finden Sie weitere Informationen zu den Unterschieden. zwischen Aufwärts und Zurück.
Pop-Back
Mit der Methode NavController.popBackStack()
wird versucht, die aktuelle
und navigieren Sie zum vorherigen Ziel. Dieses
Nutzende effektiv einen Schritt in ihrem Navigationsverlauf zurückführen. Sie gibt zurück
einen booleschen Wert, der angibt, ob es erfolgreich in das Ziel zurückgekehrt ist.
Zu einem bestimmten Ziel zurückkehren
Sie können auch popBackStack()
verwenden, um zu einem bestimmten Ziel zu navigieren. Aufgabe
Nutzen Sie eine der Überlastungen. Es gibt mehrere Möglichkeiten,
Kennung, z. B. eine Ganzzahl id
oder ein String route
. Diese Überlastung
den Nutzer zu dem Ziel führt, das der entsprechenden ID zugeordnet ist. Das Wichtigste ist:
wird alles auf dem Stack oberhalb dieses Ziels platziert.
Diese Überlastungen verwenden auch den booleschen inclusive
-Wert. Es bestimmt, ob die
NavController
sollte das angegebene Ziel auch aus dem Back-Stack entfernen
nachdem er sie aufgerufen hatte.
Sehen Sie sich als Beispiel dieses kurze Snippet an:
navController.popBackStack(R.id.destinationId, true)
Hier wird NavController
zum Ziel mit der ganzzahligen ID zurückgegeben.
destinationId
. Da der Wert des Arguments inclusive
true
ist,
NavController
entfernt auch das angegebene Ziel aus dem Back-Stack.
Umgang mit einem fehlgeschlagenen Pop-Back
Wenn popBackStack()
false
zurückgibt, wird ein nachfolgender Aufruf von
NavController.getCurrentDestination()
gibt null
zurück. Das bedeutet, dass die App
das letzte Ziel aus dem Back Stack gezogen hat. In diesem Fall sieht der Nutzer nur
ein leerer Bildschirm.
Dies kann in folgenden Fällen vorkommen:
popBackStack()
hat nichts aus dem Stapel entfernt.popBackStack()
hat ein Ziel aus dem Back Stack entfernt und der Stack ist sind jetzt leer.
Sie müssen dann ein neues Ziel aufrufen oder finish()
aufrufen, um das Problem zu beheben
auf Ihre Aktivität, um sie zu beenden. Das folgende Snippet veranschaulicht dies:
Königin
...
if (!navController.popBackStack()) {
// Call finish() on your Activity
finish()
}
Java
...
if (!navController.popBackStack()) {
// Call finish() on your Activity
finish();
}
Pop-up bis zu einem Ziel anzeigen
So entfernen Sie Ziele aus dem Back Stack, wenn Sie von einem Ziel aus navigieren
ein popUpTo()
-Argument zur verknüpften navigate()
-Funktion hinzufügen.
aufrufen. popUpTo()
weist die Navigationsbibliothek an, einige Ziele zu entfernen
aus dem Back-Stack im Rahmen des navigate()
-Aufrufs. Der Parameterwert ist
Die ID eines Ziels im Back-Stack. Die Kennung kann ein
Ganzzahl id
oder String route
.
Sie können für den Parameter inclusive
ein Argument mit dem Wert true
angeben.
um anzugeben, dass das in popUpTo()
angegebene Ziel auch
und Pop-off-Back-Stacks.
Um dies programmatisch zu implementieren, übergeben Sie popUpTo()
an navigate()
als Teil von
NavOptions
mit inclusive
auf true
gesetzt. Dies funktioniert sowohl im Schreiben- als auch im
Ansichten
Status beim Öffnen speichern
Wenn Sie mit popUpTo
zu einem Ziel navigieren, können Sie optional die
und die Status aller Ziele lösten sich vom Back Stack ab. Sie können
Stellen Sie dann den Back-Stack und die Ziele wieder her, wenn Sie zu diesem Ziel navigieren.
später ansehen. So können Sie den Status für ein bestimmtes Ziel beibehalten und
mehrere Back Stacks.
Um dies programmatisch zu tun, geben Sie saveState = true
an, wenn Sie popUpTo
hinzufügen zu
die Navigationsoptionen anpassen.
Sie können auch restoreState = true
in Ihren Navigationsoptionen angeben, um
der Back-Stack und den mit dem
Ziel.
Beispiel:
navController.navigate(
route = route,
navOptions = navOptions {
popUpTo<A>{ saveState = true }
restoreState = true
}
)
Wenn du das Speichern und Wiederherstellen des Status in XML aktivieren möchtest, definiere popUpToSaveState
als true
und restoreState
als true
in der zugehörigen action
.
Beispiel für XML
Hier ist ein Beispiel für popUpTo
in XML mit einer Aktion:
<action
android:id="@+id/action_a_to_b"
app:destination="@id/b"
app:popUpTo="@+id/a"
app:popUpToInclusive="true"
app:restoreState=”true”
app:popUpToSaveState="true"/>
Beispiel für „Compose“
Im Folgenden finden Sie ein vollständiges Beispiel dafür in Compose:
@Composable
fun MyAppNavHost(
modifier: Modifier = Modifier,
navController: NavHostController = rememberNavController(),
startDestination: Any = A
) {
NavHost(
modifier = modifier,
navController = navController,
startDestination = startDestination
) {
composable<A> {
DestinationA(
onNavigateToB = {
// Pop everything up to, and including, the A destination off
// the back stack, saving the back stack and the state of its
// destinations.
// Then restore any previous back stack state associated with
// the B destination.
// Finally navigate to the B destination.
navController.navigate(route = B) {
popUpTo<A> {
inclusive = true
saveState = true
}
restoreState = true
}
},
)
}
composable<B> { DestinationB(/* ... */) }
}
}
@Composable
fun DestinationA(onNavigateToB: () -> Unit) {
Button(onClick = onNavigateToB) {
Text("Go to A")
}
}
Im Detail können Sie ändern, wie Sie NavController.navigate()
anrufen.
auf folgende Arten:
// Pop everything up to the destination_a destination off the back stack before
// navigating to the "destination_b" destination
navController.navigate("destination_b") {
popUpTo("destination_a")
}
// Pop everything up to and including the "destination_a" destination off
// the back stack before navigating to the "destination_b" destination
navController.navigate("destination_b") {
popUpTo("destination_a") { inclusive = true }
}
// Navigate to the "search” destination only if we’re not already on
// the "search" destination, avoiding multiple copies on the top of the
// back stack
navController.navigate("search") {
launchSingleTop = true
}
Allgemeine Informationen zur Übergabe von Optionen an NavController.navigate()
finden Sie unter
Leitfaden „Mit Optionen navigieren“
Mit Aktionen platzen
Wenn du mit einer Aktion navigierst, kannst du optional zusätzliche Ziele hinzufügen aus dem Back Stack entfernt. Bei einem anfänglichen Anmeldevorgang für Ihre App wenn sich ein Nutzer angemeldet hat, sollten Sie alle Anmeldeziele um zu verhindern, dass Nutzer über die Schaltfläche „Zurück“ zur Anmeldung zurückgeleitet werden. Ablauf.
Weitere Informationen
Weitere Informationen finden Sie auf den folgenden Seiten:
- Kreisförmige Navigation: Überladene Seitennavigation vermeiden in Fällen, in denen Navigationsflüsse kreisförmig sind.
- Dialogziele: Informationen zur Einführung von Dialogzielen besondere Überlegungen zur Verwaltung Ihres Back-Stacks.