Wenn Sie mit Kotlin-DSL eine Aktion im Navigationsdiagramm definieren, generiert die Navigation eine entsprechende NavAction
-Klasse, die die für diese Aktion definierten Konfigurationen enthält. Dazu gehören:
- Ziel: Die Ressourcen-ID des Ziels.
- Standardargumente: Ein
android.os.Bundle
mit Standardwerten für das Ziel, falls angegeben. - Navigationsoptionen:Navigationsoptionen, dargestellt als
NavOptions
. Diese Klasse enthält die gesamte spezielle Konfiguration für den Wechsel vom und zum Zielziel, einschließlich der Konfiguration der Animationsressource, des Pop-Verhaltens und der Frage, ob das Ziel im Single-Top-Modus gestartet werden soll.
Optionen beim Schreiben
Das neue Ziel wird von navigate()
standardmäßig dem Back Stack hinzugefügt. Sie können das Verhalten von navigate()
ändern, indem Sie zusätzliche Navigationsoptionen an den navigate()
-Aufruf übergeben.
Sie können eine Instanz von NavOptions
mit einer einfachen Lambda-Funktion erstellen. Übergeben Sie navigate()
die Argumente, die Sie andernfalls explizit an die NavOptions.Builder
übergeben würden. Betrachten Sie die folgenden Beispiele:
Beispiele dazu, wie Optionen im Kontext an navigate()
übergeben werden, finden Sie im Back-Stack-Leitfaden.
Optionen mit XML
Die folgende Beispielgrafik besteht aus zwei Bildschirmen mit einer Aktion, um von einem zum anderen zu wechseln:
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/a">
<fragment android:id="@+id/a"
android:name="com.example.myapplication.FragmentA"
android:label="a"
tools:layout="@layout/a">
<action android:id="@+id/action_a_to_b"
app:destination="@id/b"
app:enterAnim="@anim/nav_default_enter_anim"
app:exitAnim="@anim/nav_default_exit_anim"
app:popEnterAnim="@anim/nav_default_pop_enter_anim"
app:popExitAnim="@anim/nav_default_pop_exit_anim"/>
</fragment>
<fragment android:id="@+id/b"
android:name="com.example.myapplication.FragmentB"
android:label="b"
tools:layout="@layout/b">
<action android:id="@+id/action_b_to_a"
app:destination="@id/a"
app:enterAnim="@anim/nav_default_enter_anim"
app:exitAnim="@anim/nav_default_exit_anim"
app:popEnterAnim="@anim/nav_default_pop_enter_anim"
app:popExitAnim="@anim/nav_default_pop_exit_anim"
app:popUpTo="@+id/a"
app:popUpToInclusive="true"/>
</fragment>
</navigation>
Wenn die Navigationsgrafik aufgebläht ist, werden diese Aktionen geparst und die entsprechenden NavAction
-Objekte mit den im Diagramm definierten Konfigurationen generiert. Beispiel: action_b_to_a
ist definiert als die Navigation vom Ziel b
zum Ziel a
. Die Aktion umfasst Animationen und das Verhalten popTo
, durch das alle Ziele aus dem Backstack entfernt werden. Alle diese Einstellungen werden als NavOptions
erfasst und an NavAction
angehängt.
Um diesem NavAction
zu folgen, verwenden Sie NavController.navigate()
und übergeben die ID der Aktion, wie im folgenden Beispiel gezeigt:
navController.navigate(R.id.action_b_to_a)
Optionen programmatisch anwenden
Die vorherigen Beispiele zeigen, wie NavOptions
in der XML-Datei der Navigationsgrafik angegeben wird. Bestimmte Optionen können jedoch je nach Einschränkungen, die zum Zeitpunkt der Build-Erstellung unbekannt sind, variieren. In solchen Fällen muss NavOptions
programmatisch erstellt und festgelegt werden, wie im folgenden Beispiel gezeigt:
Kotlin
findNavController().navigate(
R.id.action_fragmentOne_to_fragmentTwo,
null,
navOptions { // Use the Kotlin DSL for building NavOptions
anim {
enter = android.R.animator.fade_in
exit = android.R.animator.fade_out
}
}
)
Java
NavController navController = NavHostFragment.findNavController(this);
navController.navigate(
R.id.action_fragmentOne_to_fragmentTwo,
null,
new NavOptions.Builder()
.setEnterAnim(android.R.animator.fade_in)
.setExitAnim(android.R.animator.fade_out)
.build()
);
In diesem Beispiel wird eine erweiterte Form von navigate()
verwendet und es enthält zusätzliche Bundle
- und NavOptions
-Argumente. Alle Varianten von navigate()
haben erweiterte Versionen, die ein NavOptions
-Argument akzeptieren.
Sie können NavOptions
auch programmatisch anwenden, wenn Sie implizite Deeplinks aufrufen:
Kotlin
findNavController().navigate(
deepLinkUri,
navOptions { // Use the Kotlin DSL for building NavOptions
anim {
enter = android.R.animator.fade_in
exit = android.R.animator.fade_out
}
}
)
Java
NavController navController = NavHostFragment.findNavController(this);
navController.navigate(
deepLinkUri,
new NavOptions.Builder()
.setEnterAnim(android.R.animator.fade_in)
.setExitAnim(android.R.animator.fade_out)
.build()
);
Bei dieser Variante von navigate()
wird ein Uri
für den impliziten Deeplink sowie die Instanz NavOptions
verwendet.