การนำทางกลับคือวิธีที่ผู้ใช้เลื่อนไปตามประวัติของหน้าจอ ที่เข้าชมก่อนหน้านี้ อุปกรณ์ 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