Menavigasi dengan opsi

Saat Anda menentukan tindakan dalam grafik navigasi menggunakan DSL Kotlin, Navigation menghasilkan class NavAction yang sesuai, yang berisi konfigurasi yang ditentukan untuk tindakan tersebut, termasuk hal berikut:

  • Tujuan: ID resource tujuan target.
  • Argumen default: android.os.Bundle yang berisi nilai default untuk tujuan target, jika disediakan.
  • Opsi navigasi: Opsi navigasi, yang direpresentasikan sebagai NavOptions. Class ini berisi semua konfigurasi khusus untuk mentransisikan ke dan kembali dari tujuan target, termasuk konfigurasi resource animasi, perilaku pop up, dan apakah tujuan harus diluncurkan dalam mode single top.

Opsi dengan Compose

Secara default, navigate() menambahkan tujuan baru Anda ke data sebelumnya. Anda dapat mengubah perilaku navigate() dengan meneruskan opsi navigasi tambahan ke panggilan navigate() Anda.

Anda dapat membuat instance NavOptions menggunakan lambda sederhana. Teruskan navigate() argumen yang mungkin Anda teruskan secara eksplisit ke NavOptions.Builder. Perhatikan contoh berikut:

Misalnya, lihat panduan data sebelumnya untuk mengetahui contoh cara meneruskan opsi ke navigate() dalam konteks.

Opsi dengan XML

Berikut adalah contoh grafik yang terdiri dari dua layar beserta tindakan untuk berpindah dari satu layar ke layar lainnya:

<?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>

Saat grafik navigasi di-inflate, tindakan ini diuraikan, dan objek NavAction yang sesuai dihasilkan dengan konfigurasi yang ditentukan dalam grafik. Misalnya, action_b_to_a ditentukan saat menavigasi dari tujuan b ke tujuan a. Tindakan ini mencakup animasi beserta perilaku popTo yang menghapus semua tujuan dari backstack. Semua setelan ini ditetapkan sebagai NavOptions dan dilampirkan ke NavAction.

Untuk mengikuti NavAction ini, gunakan NavController.navigate(), yang meneruskan ID tindakan, seperti yang ditunjukkan pada contoh berikut:

    navController.navigate(R.id.action_b_to_a)

Menerapkan opsi secara terprogram

Contoh sebelumnya menunjukkan cara menentukan NavOptions dalam XML grafik navigasi. Namun, opsi tertentu dapat bervariasi bergantung pada batasan yang tidak diketahui pada waktu build. Dalam kasus tersebut, NavOptions harus dibuat dan ditetapkan secara terprogram, seperti yang ditunjukkan dalam contoh berikut:

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()
  );

Contoh ini menggunakan bentuk lebih lanjut navigate() dan berisi argumen Bundle dan NavOptions tambahan. Semua varian navigate() memiliki versi lebih lanjut yang menerima argumen NavOptions.

Anda juga dapat menerapkan NavOptions secara terprogram saat membuka deep link implisit:

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()
);

Varian navigate() ini membutuhkan Uri untuk deep link implisit, serta instance NavOptions.