Nawigacja z opcjami

Gdy zdefiniujesz działanie na wykresie nawigacyjnym za pomocą DSL Kotlin, Nawigacja wygeneruje odpowiednią klasę NavAction zawierającą konfiguracje zdefiniowane dla tego działania, takie jak:

  • Miejsce docelowe: identyfikator zasobu miejsca docelowego.
  • Argumenty domyślne: android.os.Bundle zawierający domyślne wartości miejsca docelowego (jeśli został podany).
  • Opcje nawigacji: opcje nawigacji zapisane jako NavOptions. Ta klasa zawiera całą specjalną konfigurację przejścia do i z powrotem z miejsca docelowego, w tym konfigurację zasobów animacji, zachowanie popu oraz to, czy miejsce docelowe powinno zostać uruchomione w trybie pojedynczego początku.

Opcje tworzenia wiadomości

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

Instancja NavOptions możesz utworzyć za pomocą prostej funkcji lambda. Przekaż navigate() argumenty, które w innym przypadku można by było jednoznacznie przekazać do funkcji NavOptions.Builder. Przeanalizuj te przykłady:

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

Opcje z XML

Poniżej znajdziesz przykładowy wykres, który składa się z 2 ekranów i działań umożliwiających przechodzenie między nimi:

<?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 nawigacyjnego te działania są analizowane, a odpowiadające im obiekty NavAction są generowane zgodnie z konfiguracjami określonymi na wykresie. Na przykład action_b_to_a oznacza nawigację z miejsca docelowego b do celu a. Działanie obejmuje animacje i działanie popTo, które powoduje usunięcie wszystkich miejsc docelowych ze stosu. Wszystkie te ustawienia są rejestrowane jako NavOptions i są dołączone do NavAction.

Aby śledzić ten NavAction, użyj operatora NavController.navigate(), który przekazuje identyfikator działania, tak jak w tym przykładzie:

    navController.navigate(R.id.action_b_to_a)

Automatyczne stosowanie opcji

W poprzednich przykładach pokazujemy, jak określić właściwość NavOptions w kodzie XML wykresu nawigacyjnego. Konkretne opcje mogą się jednak różnić w zależności od ograniczeń, które są nieznane na etapie kompilacji. W takich przypadkach obiekt NavOptions należy utworzyć i ustawić 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 navigate() oraz dodatkowe argumenty Bundle i NavOptions. Wszystkie warianty navigate() mają rozszerzone wersje, które akceptują argument NavOptions.

Możesz też automatycznie zastosować atrybut NavOptions po przejściu 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()
);

Ten wariant navigate() wymaga metody Uri w przypadku niejawnego precyzyjnego linku oraz instancji NavOptions.