Navegar com opções

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.