Naviga con le opzioni

Quando definisci un'azione nel grafico di navigazione utilizzando l'interfaccia DSL di Kotlin, La navigazione genera una classe NavAction corrispondente, che contiene le configurazioni definite per l'azione, tra cui:

  • Destinazione:l'ID risorsa della destinazione di destinazione.
  • Argomenti predefiniti: un elemento android.os.Bundle contenente valori predefiniti per la destinazione target, se specificata.
  • Opzioni di navigazione: opzioni di navigazione, rappresentate come NavOptions. Questa classe contiene tutte le configurazioni speciali passaggio da e verso la destinazione target, incluse le animazioni configurazione delle risorse, comportamento pop e se la destinazione è stata lanciata in modalità singola.

Opzioni con Compose

Per impostazione predefinita, navigate() aggiunge la tua nuova destinazione al back stack. Puoi modifica il comportamento di navigate() passando ulteriori opzioni di navigazione a la tua chiamata navigate().

Puoi creare un'istanza di NavOptions utilizzando una semplice funzione lambda. Superato navigate() gli argomenti che altrimenti potresti passare esplicitamente NavOptions.Builder. Considera i seguenti esempi:

Consulta la guida Back Stack per avere esempi su come trasferire le opzioni. a navigate() nel contesto.

Opzioni con XML

Di seguito è riportato un grafico di esempio costituito da due schermate insieme a un'azione per passare dall'una all'altra:

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

Quando il grafico di navigazione è gonfiato, queste azioni vengono analizzate e gli oggetti NavAction corrispondenti vengono generati con le configurazioni definite nel grafico. Ad esempio, action_b_to_a è definito come la navigazione da dalla destinazione b alla destinazione a. L'azione include animazioni e Un comportamento popTo che rimuove tutte le destinazioni dal backstack. Tutte queste risposte vengono acquisite come NavOptions e sono collegate al NavAction.

Per seguire questa NavAction, usa NavController.navigate(), trasmettendo l'ID di come mostrato nell'esempio seguente:

    navController.navigate(R.id.action_b_to_a)

Applica le opzioni in modo programmatico

Gli esempi precedenti mostrano come specificare NavOptions all'interno della navigazione il file XML del grafico. Tuttavia, opzioni specifiche possono variare a seconda dei vincoli che sono sconosciuto al momento della creazione. In questi casi, è necessario creare e impostare NavOptions in modo programmatico, come illustrato nell'esempio seguente:

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

Questo esempio utilizza una forma estesa di navigate() e contiene ulteriori Bundle e NavOptions argomenti. Tutte le varianti di navigate() sono state estese che accettano un argomento NavOptions.

Puoi anche applicare in modo programmatico NavOptions durante il passaggio alla lingua implicita Link diretti:

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

Questa variante di navigate() utilizza un Uri per il deep implicito così come l'istanza NavOptions.