Navigation mit Optionen

Wenn Sie eine Aktion im Navigationsdiagramm mit Kotlin DSL definieren, Die Navigation generiert eine entsprechende NavAction-Klasse, die das Ereignis Konfigurationen, die für diese Aktion definiert wurden, einschließlich der folgenden:

  • Ziel:Die Ressourcen-ID des Ziels.
  • Standardargumente: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 Wechsel vom Ziel zum Ziel und zurück, einschließlich Animation Ressourcenkonfiguration, Pop-Verhalten und ob das Ziel im Single-Top-Modus eingeführt.

Optionen bei „Schreiben“

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

Du kannst eine Instanz von NavOptions mit einer einfachen Lambda-Funktion erstellen. Bestanden navigate() sind die Argumente, die Sie andernfalls explizit an den NavOptions.Builder. Betrachten Sie die folgenden Beispiele:

Beispiele für die Übergabe von Optionen finden Sie im Back-Stack-Leitfaden. an navigate() im Kontext.

Optionen mit XML

Das folgende Beispieldiagramm mit zwei Bildschirmen und einer Aktion um von einer Seite 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 das Navigationsdiagramm aufgebläht ist, werden diese Aktionen geparst entsprechende NavAction-Objekte mit den definierten Konfigurationen generiert werden, im Diagramm. action_b_to_a ist z. B. definiert als die Navigation von Ziel b bis Ziel a. Die Aktion umfasst Animationen sowie popTo-Verhalten, bei dem alle Ziele aus dem Backstack entfernt werden. Alle genannten werden als NavOptions erfasst und an NavAction angehängt.

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

    navController.navigate(R.id.action_b_to_a)

Optionen programmatisch anwenden

Die vorherigen Beispiele zeigen, wie NavOptions in der Navigation angegeben wird Graph-XML. Spezifische Optionen können jedoch abhängig von Einschränkungen variieren, während der Build-Erstellung unbekannt ist. In solchen Fällen muss die NavOptions 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 sind zusätzliche Argumente Bundle und NavOptions. Alle Varianten von navigate() wurden verlängert Versionen, die ein NavOptions-Argument akzeptieren.

Sie können NavOptions auch programmatisch anwenden, wenn Sie zu „Implizit“ Deeplinks:

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 Uri für die implizite tiefe Link sowie die Instanz NavOptions.