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
.