Nawigacja z opcjami

Gdy zdefiniujesz działanie na wykresie nawigacji za pomocą języka Kotlin DSL, Navigation wygeneruje odpowiednią klasę NavAction, która zawiera konfiguracje zdefiniowane dla tego działania, w tym:

  • Miejsce docelowe: identyfikator zasobu miejsca docelowego.
  • Argumenty domyślne: obiekt android.os.Bundle zawierający domyślne wartości miejsca docelowego, jeśli zostały podane.
  • Opcje nawigacji: opcje nawigacji przedstawione jako NavOptions. Ta klasa zawiera wszystkie specjalne konfiguracje przejścia do miejsca docelowego i powrotu z niego, w tym konfigurację zasobów animacji, zachowanie wyskakującego okienka i informację o tym, czy miejsce docelowe powinno być uruchamiane w trybie pojedynczego elementu na górze.

Opcje z Compose

Domyślnie navigate() dodaje nowe miejsce docelowe do stosu wstecznego. Możesz zmodyfikować działanie funkcji navigate(), przekazując dodatkowe opcje nawigacji do wywołania funkcji navigate().

Możesz utworzyć instancję NavOptions za pomocą prostej funkcji lambda. Przekaż navigate() argumenty, które w inny sposób mogłyby zostać przekazane do NavOptions.Builder. Oto przykłady:

Przykłady znajdziesz w przewodniku po stosie wstecznym, w którym pokazujemy, jak przekazywać opcje do elementu navigate() w kontekście.

Opcje z kodem XML

Poniżej znajduje się przykładowy wykres składający się z 2 ekranów i działania, które umożliwia przejście z jednego ekranu na drugi:

<?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>

Po rozwinięciu wykresu nawigacji te działania są analizowane i generowane są odpowiednie obiekty NavAction ze skonfigurowanymi w wykresie ustawieniami. Na przykład action_b_to_a oznacza nawigację z miejsca docelowego b do miejsca docelowego a. Działanie obejmuje animacje oraz popTozachowanie, które usuwa wszystkie miejsca docelowe z listy wstecznej. Wszystkie te ustawienia są rejestrowane jako NavOptions i dołączane do NavAction.

Aby wykonać to działanie NavAction, użyj funkcji NavController.navigate(), przekazując identyfikator działania, jak pokazano w tym przykładzie:

    navController.navigate(R.id.action_b_to_a)

Automatyczne stosowanie opcji

W poprzednich przykładach pokazaliśmy, jak określić NavOptions w pliku XML wykresu nawigacji. Jednak konkretne opcje mogą się różnić w zależności od ograniczeń, które są nieznane w czasie kompilacji. W takich przypadkach element NavOptions musi zostać utworzony i ustawiony programowo, jak pokazano w tym przykładzie:

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

W tym przykładzie użyto rozszerzonej formy navigate() i zawiera on dodatkowe argumenty BundleNavOptions. Wszystkie warianty funkcji navigate() mają rozszerzone wersje, które akceptują argument NavOptions.

Możesz też programowo stosować NavOptions podczas przechodzenia do niejawnych precyzyjnych linków:

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

Ta wersja funkcji navigate() przyjmuje argument Uri dla domyślnego precyzyjnego linku oraz instancję NavOptions.