นำทางด้วยตัวเลือก

เมื่อคุณกำหนดการทำงานในกราฟการนำทางโดยใช้ 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