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

ผู้ใช้ไปยังหน้าจอก่อนหน้าได้โดยใช้การไปยังส่วนหลัง อุปกรณ์ Android ส่วนใหญ่มีปุ่มย้อนกลับ ไม่ว่าจะเป็นปุ่มบนอุปกรณ์ บนซอฟต์แวร์ หรือปุ่มที่ใช้ท่าทางสัมผัส โดยปกติแล้ว คุณไม่ควรเพิ่มปุ่มย้อนกลับลงในแอป แต่อุปกรณ์ Android Automotive OS (AAOS) ในโหมดความเข้ากันได้จะใช้ปุ่มย้อนกลับของระบบ ซึ่งจะจัดการการนําทาง คุณจึงไม่ต้องเพิ่มการนําทางของคุณเอง โปรดดูรายละเอียดที่หัวข้อโหมดความเข้ากันได้ของ AAOS

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

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

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

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

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

ตัวอย่างการใช้งาน 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() เมื่อดำเนินการดังกล่าว ระบบจะเรียกใช้การเรียกกลับตามลําดับย้อนกลับจากลําดับที่เพิ่มไว้ นั่นคือการเรียกกลับที่เพิ่มล่าสุดจะได้รับโอกาสแรกในการจัดการเหตุการณ์ปุ่ม "ย้อนกลับ" ตัวอย่างเช่น หากคุณเพิ่มการเรียกกลับ 3 รายการชื่อ one, two และ three ตามลําดับ ระบบจะเรียกใช้การเรียกกลับดังกล่าวตามลําดับ three, two และ one ตามลําดับ

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

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

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

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

Activity onBackPressed()

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

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