Naviga con le opzioni

Quando definisci un'azione nel grafico di navigazione utilizzando il DSL Kotlin, Navigation 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 android.os.Bundle contenente i valori predefiniti per la destinazione di destinazione, se forniti.
  • Opzioni di navigazione: opzioni di navigazione, rappresentate come NavOptions. Questa classe contiene tutte le configurazioni speciali per la transizione verso e dalla destinazione di destinazione, inclusa la configurazione delle risorse di animazione, il comportamento di pop-up e se la destinazione deve essere avviata in modalità single top.

Opzioni con Compose

Per impostazione predefinita, navigate() aggiunge la nuova destinazione al back stack. Puoi modificare il comportamento di navigate() passando opzioni di navigazione aggiuntive alla chiamata navigate().

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

Per esempi, consulta la guida al back stack per esempi su come passare le opzioni a navigate() nel contesto.

Opzioni con XML

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

Per seguire questa NavAction, utilizza NavController.navigate(), passando l'ID dell'azione, come mostrato nell'esempio seguente:

    navController.navigate(R.id.action_b_to_a)

Applicare le opzioni in modo programmatico

Gli esempi precedenti mostrano come specificare NavOptions all'interno dell'XML del grafico di navigazione. Tuttavia, le opzioni specifiche possono variare a seconda dei vincoli sconosciuti in fase di compilazione. 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 navighi verso 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() accetta un Uri per il link diretto implicito, nonché l'istanza NavOptions.