Naviga con le opzioni

Quando definisci un'azione nel grafico di navigazione utilizzando il DSL di Kotlin, Navigazione genera una classe NavAction corrispondente, contenente le configurazioni definite per l'azione, tra cui:

  • Destinazione: l'ID risorsa della destinazione di destinazione.
  • Argomenti predefiniti: un android.os.Bundle contenente valori predefiniti per la destinazione, se disponibile.
  • Opzioni di navigazione: opzioni di navigazione rappresentate come NavOptions. Questa classe contiene tutte le configurazioni speciali per la transizione da e verso la destinazione di destinazione, tra cui la configurazione delle risorse di animazione, il comportamento popup e se la destinazione deve essere avviata in modalità top singola.

Opzioni con Scrivi

Per impostazione predefinita, navigate() aggiunge la nuova destinazione allo stack di backup. Puoi modificare il comportamento di navigate() passando ulteriori opzioni di navigazione alla chiamata navigate().

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

Per esempi su come passare opzioni a navigate() nel contesto, consulta la guida allo stack posteriore.

Opzioni con XML

Di seguito è riportato un grafico di esempio composto da due schermate con 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 appare in modo artificioso, queste azioni vengono analizzate e vengono generati gli oggetti NavAction corrispondenti con le configurazioni definite nel grafico. Ad esempio, action_b_to_a viene definito come il passaggio dalla destinazione b alla destinazione a. L'azione include animazioni e comportamento popTo che rimuove tutte le destinazioni dallo stack. Tutte queste impostazioni vengono acquisite come NavOptions e sono collegate a NavAction.

Per seguire questo NavAction, usa NavController.navigate(), trasmettendo l'ID dell'azione, 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 nel file XML del grafico di navigazione. Tuttavia, opzioni specifiche possono variare a seconda di vincoli che non sono noti al momento della build. In questi casi, NavOptions deve essere creato e impostato in modo programmatico, come mostrato 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 argomenti Bundle e NavOptions aggiuntivi. Tutte le varianti di navigate() hanno versioni estese che accettano un argomento NavOptions.

Puoi anche applicare NavOptions in modo programmatico quando accedi ai link diretti impliciti:

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() prende un Uri per il link diretto implicito, così come per l'istanza NavOptions.