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
.