Navigation mit Optionen

Wenn Sie eine Aktion im Navigationsdiagramm mit der Kotlin-DSL definieren, generiert Navigation eine entsprechende NavAction-Klasse, die die für diese Aktion definierten Konfigurationen enthält, einschließlich der folgenden:

  • Ziel: Die Ressourcen-ID des Zielorts.
  • 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 Übergang zum und vom Zielort zurück, einschließlich der Konfiguration der Animationsressource, des Pop-Verhaltens und der Frage, ob das Ziel im Single-Top-Modus gestartet werden soll.

Optionen mit Compose

Standardmäßig fügt navigate() das neue Ziel dem Back-Stack hinzu. Sie können das Verhalten von navigate() ändern, indem Sie dem navigate()-Aufruf zusätzliche Navigationsoptionen übergeben.

Sie können eine Instanz von NavOptions mit einer einfachen Lambda-Funktion erstellen. Übergeben Sie navigate() die Argumente, die Sie sonst explizit an NavOptions.Builder übergeben würden. Betrachten Sie hierzu folgende Beispiele:

Beispiele finden Sie in der Anleitung zum Back-Stack. Dort wird gezeigt, wie Sie Optionen an navigate() im Kontext übergeben.

Optionen mit XML

Das folgende Beispiel zeigt ein Diagramm mit zwei Bildschirmen und einer Aktion, um von einem zum anderen zu navigieren:

<?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 das Navigationsdiagramm erweitert wird, werden diese Aktionen geparst und entsprechende NavAction-Objekte mit den im Diagramm definierten Konfigurationen generiert. Beispielsweise ist action_b_to_a so definiert, dass von Ziel b zu Ziel a navigiert wird. Die Aktion umfasst Animationen sowie ein popTo-Verhalten, mit dem alle Ziele aus dem Back-Stack entfernt werden. Alle diese Einstellungen werden als NavOptions erfasst und an die NavAction angehängt.

Um dieser NavAction zu folgen, verwenden Sie NavController.navigate() und übergeben Sie die ID der Aktion, wie im folgenden Beispiel gezeigt:

    navController.navigate(R.id.action_b_to_a)

Optionen programmatisch anwenden

In den vorherigen Beispielen wird gezeigt, wie Sie NavOptions in der XML-Datei des Navigationsdiagramms angeben. Bestimmte Optionen können jedoch je nach Einschränkungen variieren, die zur Build-Zeit nicht bekannt sind. In solchen Fällen müssen die 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, die zusätzliche Bundle und NavOptions Argumente enthält. Alle Varianten von navigate() haben erweiterte Versionen, die ein NavOptions-Argument akzeptieren.

Sie können NavOptions auch programmatisch anwenden, wenn Sie zu impliziten Deeplinks navigieren:

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()
);

Diese Variante von navigate() verwendet einen Uri-Wert für den impliziten Deeplink sowie die NavOptions Instanz.