เมื่อคุณกําหนดการกระทําในกราฟการนําทางโดยใช้ Kotlin DSL Navigation จะสร้างคลาส NavAction ที่เกี่ยวข้อง ซึ่งมีการกําหนดค่าที่กําหนดไว้สําหรับการกระทํานั้น รวมถึงรายการต่อไปนี้
- ปลายทาง: รหัสทรัพยากรของปลายทางเป้าหมาย
- อาร์กิวเมนต์เริ่มต้น:
android.os.Bundleที่มีค่าเริ่มต้น สำหรับปลายทางเป้าหมาย หากระบุ - ตัวเลือกการนำทาง: ตัวเลือกการนำทางที่แสดงเป็น
NavOptionsคลาสนี้มีการกำหนดค่าพิเศษทั้งหมดสำหรับการเปลี่ยนผ่านไปและกลับจากปลายทางเป้าหมาย ซึ่งรวมถึงการกำหนดค่าทรัพยากรภาพเคลื่อนไหว ลักษณะการแสดงป๊อปอัป และไม่ว่าควรเปิดปลายทางในโหมด Single Top หรือไม่
ตัวเลือกที่มีฟีเจอร์เขียน
โดยค่าเริ่มต้น navigate() จะเพิ่มปลายทางใหม่ลงใน Back Stack คุณสามารถ
แก้ไขลักษณะการทำงานของ navigate() ได้โดยส่งตัวเลือกการนำทางเพิ่มเติมไปยังการเรียกใช้ navigate()
คุณสร้างอินสแตนซ์ของ NavOptions ได้โดยใช้ Lambda อย่างง่าย ส่ง
navigate()อาร์กิวเมนต์ที่คุณอาจส่งไปยัง
NavOptions.Builderอย่างชัดเจน ลองดูตัวอย่างต่อไปนี้
ดูตัวอย่างได้ที่คู่มือ Back Stackเพื่อดูตัวอย่างวิธีส่งตัวเลือก
ไปยัง navigate() ในบริบท
ตัวเลือกที่มี XML
ต่อไปนี้เป็นตัวอย่างกราฟที่ประกอบด้วย 2 หน้าจอพร้อมกับการดำเนินการ เพื่อไปยังอีกหน้าจอหนึ่ง
<?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>
เมื่อขยายกราฟการนำทาง ระบบจะแยกวิเคราะห์การดำเนินการเหล่านี้และสร้างออบเจ็กต์ NavAction ที่เกี่ยวข้องโดยมีการกำหนดค่าที่กำหนดไว้ในกราฟ เช่น action_b_to_a หมายถึงการนำทางจาก
ปลายทาง b ไปยังปลายทาง a การดำเนินการนี้รวมถึงภาพเคลื่อนไหวพร้อมกับ
popToลักษณะการทำงานที่นำปลายทางทั้งหมดออกจาก Backstack ระบบจะบันทึกการตั้งค่าทั้งหมดเหล่านี้เป็นNavOptions และแนบไปกับNavAction
หากต้องการทำตาม NavAction นี้ ให้ใช้ NavController.navigate() โดยส่งรหัสของการดำเนินการ ดังที่แสดงในตัวอย่างต่อไปนี้
navController.navigate(R.id.action_b_to_a)
ใช้ตัวเลือกแบบเป็นโปรแกรม
ตัวอย่างก่อนหน้าแสดงวิธีระบุ NavOptions ภายใน XML ของกราฟการนำทาง
อย่างไรก็ตาม ตัวเลือกที่เฉพาะเจาะจงอาจแตกต่างกันไปตามข้อจำกัดที่ ไม่ทราบในเวลาบิลด์ ในกรณีดังกล่าว คุณต้องสร้างและตั้งค่า NavOptions โดยใช้โปรแกรม ดังที่แสดงในตัวอย่างต่อไปนี้
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()
);
ตัวอย่างนี้ใช้รูปแบบขยายของ navigate() และมีอาร์กิวเมนต์ Bundle และ NavOptions เพิ่มเติม navigate() ทุกรูปแบบมีเวอร์ชันที่ขยาย
ซึ่งรับอาร์กิวเมนต์ NavOptions
นอกจากนี้ คุณยังใช้ NavOptions โดยอัตโนมัติเมื่อไปยัง Deep Link โดยนัยได้ด้วย
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()
);
navigate() รูปแบบนี้ใช้ Uri สำหรับ Deep Link โดยนัย รวมถึงอินสแตนซ์ NavOptions