Implement Custom Back Navigation in Fragment
Android Dev ทุกคนน่าจะรู้กันดีว่าเวลาที่เราต้องการจัดการกับการกด back จาก navigation ใน fragment นั้นมันยุ่งยากมากๆ เพราะมันไม่มี onBackPressed() ให้ implement เหมือน activity ซึ่งวิธีแก้ปัญหานี้ในแต่ละคนก็จะแตกต่างกันไป
แต่ว่าเมื่อเราย้ายมาใช้ AndroidX เราสามารถ implement OnBackPressedDispatcher ใน fragment ได้เพื่อทำการ handle การกด back
requireActivity()
.onBackPressedDispatcher
.addCallback(LifecycleOwner, OnBackPressedCallback)
ตัวอย่าง:
class MainFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requireActivity()
.onBackPressedDispatcher
.addCallback(this,
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
//do something
}
})
}
}
จากโค้ดข้างบน
- this ก็คือ LifecycleOwner นั้นเอง
- addCallback ทำการเพิ่ม callback ให้กับ onBackPressedDispatcher โดยตัว callback เราไม่จำเป็นต้อง remove เองเพราะจะถูกผูกไว้กับ LifecycleOwner อยู่แล้วแล้วเมื่อ life cycle state เปลี่ยนเป็น DESTROYED ตัว callback ก็จะถูก remove ออกไปด้วย หรือถ้าต้องการ remove เองก็สามารถทำได้โดยเรียก method remove()
- OnBackPressedCallback(true) ทำการสร้าง new instances ของ class OnBackPressedCallback โดย constructor class นี้จะให้เราส่งค่า boolean เข้าไปด้วยเพื่อ enabled state ของ callback
- handleOnBackPressed เป็น abstract method ที่อยู่ใน class OnBackPressedCallback ที่เราจำเป็นต้อง implement เมื่อมีการกด back เราสามารถมา handle action ที่เราต้องการได้ภายใน method นี้
เพิ่มเติม: ใน activity ก็สามารถ implement OnBackPressedCallback ได้เหมือนกันนะเพราะ method getOnBackPressedDispatcher() จะอยู่ใน class ComponentActivity ซึ่งจะถูก FragmentActivity extend มา จากนั้นก็ถูก AppCompatActivity extend มาอีกทีนั่นเอง
สรุป
การใช้ OnBackPressedDispatcher จะช่วยให้ Android developer สามารถจัดการกับการกดปุ่ม back ของ user จากทั้ง software navigation หรือ physical navigation ใน fragment ได้ง่ายขึ้น แต่ก็มีข้อแม้ว่าต้องเปลี่ยนมาใช้ AndroidX ก่อนนะ (ซึ่งตอนนี้ก็น่าจะเปลี่ยนมาใช้กันเยอะแล้ว) สำหรับข้อมูลเพิ่มเติมสามารถไปอ่านได้จากที่นี่เลย