Navigation mit Optionen

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.