แสดงการนำทางกลับที่กำหนดเอง

การนำทางกลับคือวิธีที่ผู้ใช้เลื่อนไปตามประวัติของหน้าจอ ที่เข้าชมก่อนหน้านี้ อุปกรณ์ Android ทั้งหมดมีปุ่ม "กลับ" สำหรับ การนำทาง ดังนั้นคุณจึงไม่ควรเพิ่มปุ่ม "ย้อนกลับ" ลงใน UI ของแอป ขึ้นอยู่กับ อุปกรณ์ Android ของผู้ใช้ ปุ่มนี้อาจเป็นปุ่มจริงหรือซอฟต์แวร์

Android เก็บรักษาสแต็กสำรองของปลายทางไว้ขณะที่ผู้ใช้ไปยังส่วนต่างๆ ในแอปพลิเคชันของคุณ ซึ่งโดยปกติจะช่วยให้ Android สามารถไปยัง ปลายทางก่อนหน้าเมื่อกดปุ่มย้อนกลับ อย่างไรก็ตาม ก็มี ที่แอปอาจต้องใช้ลักษณะการทำงาน "ย้อนกลับ" ของตัวเองเพื่อ มอบประสบการณ์ที่ดีที่สุดแก่ผู้ใช้ เช่น เมื่อใช้ WebView คุณอาจต้องการลบล้างการทำงานเริ่มต้นของปุ่ม "กลับ" เพื่อให้ผู้ใช้ ย้อนกลับผ่านประวัติการท่องเว็บแทนหน้าจอก่อนหน้า ในแอปของคุณ

ใช้การนำทางกลับที่กำหนดเอง

ComponentActivity ฐาน ชั้นเรียนสำหรับ FragmentActivity และ AppCompatActivity จะช่วยให้คุณควบคุมการทำงานของปุ่ม "ย้อนกลับ" ได้โดยใช้ OnBackPressedDispatcher ซึ่งสามารถดึงข้อมูลได้โดยโทรไปที่ getOnBackPressedDispatcher()

OnBackPressedDispatcher จะควบคุมวิธีการส่งเหตุการณ์ของปุ่มย้อนกลับ ไปยัง OnBackPressedCallback อย่างน้อย 1 รายการ ออบเจ็กต์ ตัวสร้างสำหรับ OnBackPressedCallback จะใช้บูลีนสำหรับค่า สถานะเปิดใช้งานเริ่มต้น เฉพาะเมื่อเปิดใช้การติดต่อกลับ (เช่น isEnabled() ส่งคืน true) ผู้จัดการจะโทรหา handleOnBackPressed() ในการจัดการกับเหตุการณ์ของปุ่มย้อนกลับ คุณสามารถเปลี่ยนสถานะเปิดใช้โดยการโทร setEnabled()

เพิ่มการติดต่อกลับผ่านเมธอด addCallback ขอแนะนำเป็นอย่างยิ่งให้ ใช้addCallback() ซึ่งใช้ LifecycleOwner การดำเนินการนี้จะทำให้มีการเพิ่ม OnBackPressedCallback เมื่อ LifecycleOwner เท่านั้น Lifecycle.State.STARTED กิจกรรมจะนำ Callback ที่ลงทะเบียนไว้ออกเมื่อเชื่อมโยง LifecycleOwner ถูกทำลาย ซึ่งช่วยป้องกันการรั่วไหลของหน่วยความจำและทำให้เหมาะสม เพื่อใช้ใน Fragment หรือเจ้าของวงจรรายอื่นๆ ที่มีอายุการใช้งานสั้นกว่า มากกว่ากิจกรรม

ตัวอย่างการใช้งาน Callback

Kotlin

class MyFragment : Fragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // This callback will only be called when MyFragment is at least Started.
        val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
            // Handle the back button event
        }

        // The callback can be enabled or disabled here or in the lambda
    }
    ...
}

Java

public class MyFragment extends Fragment {

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // This callback will only be called when MyFragment is at least Started.
        OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) {
            @Override
            public void handleOnBackPressed() {
                // Handle the back button event
            }
        };
        requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);

        // The callback can be enabled or disabled here or in handleOnBackPressed()
    }
    ...
}

คุณโทรกลับได้หลายรายการผ่านaddCallback() เมื่อดำเนินการดังกล่าว ระบบจะเรียกใช้ Callback ตามลำดับกลับกัน เพิ่ม - Callback ที่เพิ่มล่าสุดคือรายการแรกที่ให้โอกาสในการจัดการ เหตุการณ์ของปุ่มย้อนกลับ ตัวอย่างเช่น หากคุณเพิ่ม Callback 3 รายการที่ชื่อ one, two และ three ในลำดับ จะมีการเรียกใช้ตามลำดับ three, two และ one ตามลำดับ

Callback จะเป็นไปตาม ห่วงโซ่ความรับผิดชอบ รูปแบบ ระบบจะเรียกใช้ Callback แต่ละรายการในเชนเฉพาะเมื่อมีการเรียกใช้ ไม่ได้เปิดใช้ Callback ซึ่งหมายความว่าใน ตัวอย่างก่อนหน้านี้ ระบบจะเรียกใช้ Callback two เฉพาะในกรณีที่ Callback three ไม่ได้เปิดใช้งาน จะมีการเรียกใช้ one ของ Callback หาก Callback two เท่านั้น ไม่ได้เปิดใช้งาน และอื่นๆ

โปรดทราบว่าเมื่อเพิ่มผ่าน addCallback() Callback จะไม่เพิ่มลงในห่วงโซ่ความรับผิดชอบจนกว่า LifecycleOwner เข้าสู่ Lifecycle.State.STARTED

การเปลี่ยนสถานะการเปิดใช้ใน OnBackPressedCallback มีผลอย่างมาก ขอแนะนําสําหรับการเปลี่ยนแปลงชั่วคราวเนื่องจากยังคงเป็นไปตามลําดับที่อธิบายไว้ข้างต้น ซึ่งสำคัญอย่างยิ่งหากคุณมี Callback ที่ลงทะเบียนใน เจ้าของวงจรที่ซ้อนกันแต่ละราย

แต่ในกรณีที่ต้องการนำ OnBackPressedCallback ออกทั้งหมด เธอควรโทรหา remove() แต่โดยทั่วไปจะไม่จำเป็นต้องดำเนินการ เนื่องจากระบบจะนำ Callback ออกโดยอัตโนมัติเมื่อ LifecycleOwner ที่เชื่อมโยง ถูกทำลาย

กิจกรรม onBackPressed()

หากคุณกำลังใช้ onBackPressed() ในการจัดการกับเหตุการณ์ของปุ่มย้อนกลับ เราขอแนะนำให้คุณใช้ OnBackPressedCallback แทน แต่หากคุณทำการเปลี่ยนแปลงนี้ไม่ได้ ให้ใช้กฎต่อไปนี้

  • ระบบจะประเมิน Callback ทั้งหมดที่ลงทะเบียนผ่าน addCallback เมื่อคุณโทรหา super.onBackPressed()
  • ใน Android 12 (API ระดับ 32) และต่ำกว่า จะมีการเรียกใช้ onBackPressed เสมอ โดยไม่คำนึงถึงอินสแตนซ์ที่ลงทะเบียนของ OnBackPressedCallback