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

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

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

เช่น เมื่อใช้ WebView คุณอาจต้องการลบล้างการทำงานเริ่มต้นของปุ่ม "กลับ" เพื่อให้ผู้ใช้ ย้อนกลับผ่านประวัติการท่องเว็บแทนหน้าจอก่อนหน้า ในแอปของคุณ

Android 13 ขึ้นไปมีท่าทางสัมผัสย้อนกลับแบบคาดการณ์สำหรับอุปกรณ์ Android ถึง ดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์นี้ได้ที่เพิ่มการรองรับท่าทางสัมผัสการย้อนกลับแบบคาดเดา

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

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

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

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

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

Kotlin

class MyFragment : Fragment() {

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

        // This callback is only 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 is only 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()
    }
    ...
}

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

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

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

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

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

กิจกรรม onBackPressed()

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

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