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
.