ผู้ใช้จะไปยังหน้าจอก่อนหน้าโดยใช้ การนำทางย้อนกลับ อุปกรณ์ Android ส่วนใหญ่มีปุ่มย้อนกลับ (แบบกายภาพ แบบซอฟต์แวร์ หรือแบบใช้ท่าทางสัมผัส) โดยปกติแล้วคุณไม่ควรเพิ่มปุ่มย้อนกลับลงในแอป อย่างไรก็ตาม อุปกรณ์ Android Automotive OS (AAOS) ในโหมดความเข้ากันได้จะใช้ปุ่มย้อนกลับของระบบ ซึ่งจะจัดการการนำทางให้ คุณจึงไม่จำเป็นต้องเพิ่มปุ่มย้อนกลับเอง ดูรายละเอียดได้ที่ โหมดความเข้ากันได้ของ AAOS
Android จะเก็บ สแต็กย้อนกลับของปลายทางไว้เมื่อผู้ใช้ไปยังส่วนต่างๆ ของแอปพลิเคชัน ซึ่งโดยปกติแล้วจะช่วยให้ Android นำทางไปยังปลายทางก่อนหน้าได้อย่างถูกต้องเมื่อกดปุ่มย้อนกลับ อย่างไรก็ตาม มีบางกรณีที่แอปของคุณอาจต้องใช้ลักษณะการทำงานของปุ่มย้อนกลับเองเพื่อให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ดีที่สุด เช่น เมื่อใช้ WebView คุณอาจต้องการลบล้างลักษณะการทำงานเริ่มต้นของปุ่มย้อนกลับเพื่อให้ผู้ใช้ไปยังส่วนต่างๆ ในประวัติการท่องเว็บแทนที่จะเป็นหน้าจอก่อนหน้าในแอป
ใช้การนำทางย้อนกลับที่กำหนดเองใน Compose
ใน Jetpack Compose คุณสามารถจัดการการนำทางย้อนกลับที่กำหนดเองได้โดยใช้คอมโพสได้
BackHandler
เมื่อใช้ Navigation Compose โดยปกติแล้วคุณจะใช้
NavController.navigateUp() หรือ NavController.popBackStack()
เพื่อไปยังหน้าจอก่อนหน้าใน Back Stack อย่างไรก็ตาม BackHandler มีประโยชน์ในกรณีที่คุณต้องการใช้ลักษณะการทำงานที่กำหนดเองเมื่อผู้ใช้กดปุ่มย้อนกลับของระบบหรือใช้ท่าทางย้อนกลับ เช่น หากคุณ
แสดง WebView ในแอป คุณอาจต้องการอนุญาตให้ผู้ใช้
ไปยังส่วนต่างๆ ในประวัติการท่องเว็บเมื่อกดปุ่มย้อนกลับของระบบ
การใช้งานพื้นฐาน
ตัวอย่างต่อไปนี้แสดงวิธีดักจับเหตุการณ์ย้อนกลับเพื่อควบคุมสถานะที่กำหนดเอง (เช่น การยุบแผง)
@Composable fun MyScreen() { var isExpanded by remember { mutableStateOf(false) } // Intercept the back button or gesture only when isExpanded is true BackHandler(enabled = isExpanded) { // Collapsing the content disables this handler, so it does not // receive the next back event. isExpanded = false } if (isExpanded) { Text("Expanded content. Go back to collapse it.") } else { Button(onClick = { isExpanded = true }) { Text("Expand") } } }
การดักจับแผนผังคอมโพสได้
หากคุณมี Composable BackHandler หลายรายการที่เปิดใช้อยู่ในระดับต่างๆ ของแผนผัง Composable เฉพาะ Composable ที่อยู่ด้านในสุดเท่านั้นที่จะดักจับเหตุการณ์ย้อนกลับ
ใช้การนำทางย้อนกลับที่กำหนดเองกับ Views
ComponentActivity ซึ่งเป็นคลาสพื้นฐานสำหรับ FragmentActivity และ
AppCompatActivity ช่วยให้คุณควบคุมลักษณะการทำงานของปุ่มย้อนกลับ
ได้โดยใช้ OnBackPressedDispatcher ซึ่งคุณสามารถเรียกข้อมูลได้โดยการเรียกใช้
getOnBackPressedDispatcher()
OnBackPressedDispatcher จะควบคุมวิธีส่งเหตุการณ์ปุ่มย้อนกลับ
ไปยังออบเจ็กต์ OnBackPressedCallback อย่างน้อย 1 รายการ คอนสตรักเตอร์สำหรับ OnBackPressedCallback จะใช้บูลีนสำหรับสถานะเริ่มต้นที่เปิดใช้ เฉพาะเมื่อ
เปิดใช้การเรียกกลับเท่านั้น เช่น เมื่อ isEnabled() แสดงผล true ดิสแพตเชอร์จะเรียกใช้ handleOnBackPressed() ของการเรียกกลับเพื่อจัดการเหตุการณ์ปุ่มย้อนกลับ
คุณสามารถเปลี่ยนสถานะที่เปิดใช้ได้โดยการเรียกใช้
setEnabled()
ระบบจะเพิ่มการเรียกกลับโดยใช้วิธี addCallback ใช้วิธี
addCallback() ซึ่งใช้ LifecycleOwner วิธีนี้จะเพิ่ม
OnBackPressedCallback เฉพาะเมื่อ LifecycleOwner อยู่ในสถานะ
Lifecycle.State.STARTED กิจกรรมจะนำ Callback ที่ลงทะเบียนไว้ออกด้วยเมื่อ LifecycleOwner ที่เชื่อมโยงถูกทำลาย ซึ่งจะป้องกันหน่วยความจำรั่วไหลและทำให้เหมาะสำหรับการใช้งานใน Fragment หรือ LifecycleOwner อื่นๆ ที่มีอายุการใช้งานสั้นกว่ากิจกรรม
ตัวอย่างการใช้การเรียกกลับมีดังนี้
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 } ... }
คุณสามารถระบุการเรียกกลับหลายรายการได้โดยใช้ addCallback()
เมื่อทำเช่นนั้น ระบบจะเรียกใช้การเรียกกลับตามลำดับย้อนกลับของลำดับที่เพิ่ม กล่าวคือ การเรียกกลับที่เพิ่มล่าสุดจะเป็นการเรียกกลับแรกที่ได้รับโอกาสในการจัดการเหตุการณ์ปุ่มย้อนกลับ ตัวอย่างเช่น หากคุณเพิ่มการเรียกกลับ 3 รายการชื่อ one, two และ three ตามลำดับ ระบบจะเรียกใช้การเรียกกลับตามลำดับ three, two และ one ตามลำดับ
การเรียกกลับเป็นไปตามรูปแบบ
Chain of Responsibility
ระบบจะเรียกใช้การเรียกกลับแต่ละรายการในเชนก็ต่อเมื่อการเรียกกลับก่อนหน้าไม่ได้เปิดใช้อยู่ ซึ่งหมายความว่าในตัวอย่างก่อนหน้า ระบบจะเรียกใช้การเรียกกลับ two ก็ต่อเมื่อการเรียกกลับ three ไม่ได้เปิดใช้อยู่ ระบบจะเรียกใช้การเรียกกลับ one ก็ต่อเมื่อการเรียกกลับ two ไม่ได้เปิดใช้อยู่ และรูปแบบนี้จะดำเนินต่อไปสำหรับการเรียกกลับเพิ่มเติม
โปรดทราบว่าเมื่อเพิ่มโดยใช้ addCallback(),
ระบบจะไม่เพิ่มการเรียกกลับลงในเชนความรับผิดชอบจนกว่า
LifecycleOwner จะเข้าสู่
Lifecycle.State.STARTED
สถานะ
เราขอแนะนำให้เปลี่ยนสถานะที่เปิดใช้ในการเรียกกลับสำหรับการเปลี่ยนแปลงชั่วคราว เนื่องจากจะรักษาลำดับที่อธิบายไว้ก่อนหน้านี้ ซึ่งมีความสำคัญอย่างยิ่งหากคุณมีการเรียกกลับที่ลงทะเบียนไว้ใน LifecycleOwner ที่ซ้อนกันหลายรายการ
หากต้องการนำการเรียกกลับออกทั้งหมด ให้เรียกใช้
remove()
โดยปกติแล้วคุณไม่จำเป็นต้องทำเช่นนี้ เนื่องจากระบบจะนำการเรียกกลับออกโดยอัตโนมัติ
เมื่อ LifecycleOwner ที่เชื่อมโยงถูกทำลาย