Quando você define uma ação no gráfico de navegação usando a DSL do Kotlin,
a navegação gera uma classe NavAction
correspondente, que contém as
configurações definidas para essa ação, incluindo o seguinte:
- Destino: o ID do recurso do destino.
- Argumentos padrão: um
android.os.Bundle
contendo valores padrão para o destino, se fornecido. - Opções de navegação: opções de navegação, representadas como
NavOptions
. Essa classe contém toda a configuração especial para a transição para e de volta do destino, incluindo a configuração do recurso de animação, o comportamento de destaque e se o destino precisa ser iniciado no modo superior único.
Opções com o Compose
Por padrão, navigate()
adiciona seu novo destino à backstack. Você pode
modificar o comportamento de navigate()
transmitindo outras opções de navegação para
a chamada de navigate()
.
É possível criar uma instância de NavOptions
usando uma lambda simples. Transmita a
navigate()
os argumentos que você poderia transmitir explicitamente para o
NavOptions.Builder
. Confira estes exemplos:
Consulte o guia da backstack para conferir exemplos de como transmitir opções
para navigate()
no contexto.
Opções com XML
O gráfico a seguir é um exemplo que consiste em duas telas e uma ação para navegar de uma para a outra:
<?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 o gráfico de navegação é aumentado, essas ações são analisadas, e
os objetos NavAction
correspondentes são gerados com as configurações definidas
no gráfico. Por exemplo, action_b_to_a
é definido como a navegação do
destino b
para o destino a
. A ação inclui animações com o comportamento
popTo
que remove todos os destinos da pilha de retorno. Todas essas
configurações são capturadas como NavOptions
e anexadas a NavAction
.
Para acompanhar esse NavAction
, use NavController.navigate()
, passando o ID da
ação, conforme mostrado no exemplo a seguir.
navController.navigate(R.id.action_b_to_a)
Aplicar opções de forma programática
Os exemplos anteriores mostram como especificar NavOptions
no
XML do gráfico de navegação. No entanto, opções específicas podem variar, dependendo de restrições
desconhecidas no tempo de build. Nesses casos, o NavOptions
precisa ser criado e definido
programaticamente, conforme mostrado no exemplo a seguir.
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()
);
Esse exemplo usa uma forma estendida de navigate()
e contém outros argumentos
Bundle
e NavOptions
. Todas as variantes de navigate()
têm versões estendidas
que aceitam um argumento NavOptions
.
Também é possível aplicar o NavOptions
programaticamente ao navegar para links diretos
implícitos:
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()
);
Essa variante de navigate()
usa um Uri
para o link
direto implícito, bem como a instância NavOptions
.