Nawigacja z opcjami

Gdy zdefiniujesz działanie na wykresie nawigacyjnym za pomocą DSL Kotlin, Nawigacja generuje odpowiednią klasę NavAction, która zawiera konfiguracje zdefiniowane dla tego działania, w tym:

  • Miejsce docelowe: identyfikator zasobu miejsca docelowego.
  • Argumenty domyślne: android.os.Bundle zawierający wartości domyślne dla miejsca docelowego (jeśli zostało podane).
  • Opcje nawigacji: opcje nawigacji wyświetlane jako NavOptions Ta klasa zawiera całą konfigurację specjalną dla: przejście do i z powrotem z miejsca docelowego, łącznie z animacją konfigurację zasobów, zachowanie wyostrzenia oraz określenie, czy miejsce docelowe powinno być w trybie pojedynczego od góry.

Opcje dostępne podczas tworzenia wiadomości

Domyślnie navigate() dodaje nowe miejsce docelowe do stosu tylnego. Dostępne opcje zmień działanie navigate(), przekazując dodatkowe opcje nawigacji do navigate().

Za pomocą prostej funkcji lambda można utworzyć instancję NavOptions. Powodzenie navigate() argumenty, które w innym przypadku można bezpośrednio przekazać do funkcji NavOptions.Builder Zobacz te przykłady:

Przykłady znajdziesz w przewodniku po wstecznym stosie zawierającym przykłady przekazywania opcji przekazywania do navigate() w kontekście.

Opcje z XML

Poniżej znajduje się przykładowy wykres składający się z 2 ekranów i działań aby przejść z jednego do drugiego:

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

Jeśli wykres nawigacyjny jest większy, działania te są analizowane, odpowiednie obiekty NavAction są generowane ze zdefiniowanymi konfiguracjami na wykresie. Na przykład action_b_to_a oznacza nawigację z miejsce docelowe: b do miejsca docelowego: a. Akcja zawiera animacje Działanie popTo, które powoduje usunięcie wszystkich miejsc docelowych z backendu. Wszystkie ustawienia są rejestrowane jako NavOptions i są dołączone do NavAction.

Aby śledzić ten element typu NavAction, użyj parametru NavController.navigate(), przekazując w nim identyfikator: działanie, jak w tym przykładzie:

    navController.navigate(R.id.action_b_to_a)

Stosowanie opcji w sposób automatyczny

Poprzednie przykłady pokazują, jak określić NavOptions w menu nawigacyjnym. kodu XML wykresu. Jednak konkretne opcje mogą się różnić w zależności od ograniczeń nieznane w momencie kompilacji. W takich przypadkach należy utworzyć i ustawić NavOptions automatycznie, jak 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 ciągu navigate() i zawiera dodatkowe Argumenty Bundle oraz NavOptions. Wszystkie warianty reklam navigate() zostały rozszerzone wersji, które akceptują argument NavOptions.

Możesz też automatycznie zastosować NavOptions po przejściu do trybu niejawnego precyzyjne linki:

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

Ten wariant interfejsu navigate() zajmuje Uri dla niejawnego głębokiego i instancji NavOptions.