เมื่อคุณกำหนดการทำงานในกราฟการนำทางโดยใช้ Kotlin DSL
การไปยังส่วนต่างๆ จะสร้างคลาส NavAction
ที่เกี่ยวข้องซึ่งมี
การกำหนดค่าที่กำหนดไว้สำหรับการทำงานนั้น ซึ่งรวมถึงรายการต่อไปนี้
- ปลายทาง: รหัสทรัพยากรของปลายทางเป้าหมาย
- อาร์กิวเมนต์เริ่มต้น:
android.os.Bundle
ที่มีค่าเริ่มต้น สำหรับปลายทางเป้าหมาย หากระบุ - ตัวเลือกการนำทาง: ตัวเลือกการนำทางซึ่งแสดงเป็น
NavOptions
คลาสนี้มีการกำหนดค่าพิเศษทั้งหมดสำหรับ การเปลี่ยนไปยังและกลับจากปลายทางเป้าหมาย ซึ่งรวมถึงภาพเคลื่อนไหว การกำหนดค่าทรัพยากร ลักษณะการทำงานของป๊อป และกำหนดปลายทางที่ควรจะเป็น ซึ่งเปิดตัวในโหมด เดี่ยวๆ
ตัวเลือกในการเขียน
โดยค่าเริ่มต้น navigate()
จะเพิ่มปลายทางใหม่ในกลุ่มแบ็กสแต็ก คุณสามารถ
แก้ไขลักษณะการทำงานของ 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
แบบเป็นโปรแกรมได้ด้วยเมื่อไปยังแบบไม่เจาะจงปลายทาง
ลิงก์ในรายละเอียด:
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
สําหรับ Implicit Deep
รวมทั้งอินสแตนซ์ NavOptions