ฟีเจอร์การนําทางด้วยท่าทางสัมผัส "กลับโดยประมาณ" ช่วยให้ผู้ใช้ดูตัวอย่างตําแหน่งที่การปัดกลับจะนําไป
เช่น การใช้ท่าทางสัมผัสเพื่อกลับอาจแสดงตัวอย่างภาพเคลื่อนไหวของหน้าจอหลักที่อยู่เบื้องหลังแอป ดังที่แสดงในภาพตัวอย่างในรูปที่ 1
ตั้งแต่ Android 15 เป็นต้นไป ตัวเลือกสำหรับนักพัฒนาแอปสำหรับภาพเคลื่อนไหวแบบคาดเดาการย้อนกลับจะไม่มีให้บริการอีกต่อไป ตอนนี้ภาพเคลื่อนไหวของระบบ เช่น กลับไปที่หน้าจอหลัก ข้ามงาน และข้ามกิจกรรม จะปรากฏในแอปที่เลือกใช้ท่าทางสัมผัสย้อนกลับแบบคาดเดาทั้งหมดหรือที่ระดับกิจกรรม
คุณสามารถทดสอบภาพเคลื่อนไหวการกลับไปที่หน้าแรกนี้ (ตามที่อธิบายไว้ในส่วนถัดไปของหน้านี้)
การรองรับท่าทางสัมผัสเพื่อย้อนกลับแบบคาดการณ์ต้องอัปเดตแอปโดยใช้ API OnBackPressedCallback
AppCompat 1.6.0-alpha05 (AndroidX) ขึ้นไปที่ใช้งานร่วมกันได้ย้อนหลัง หรือใช้ OnBackInvokedCallback
API แพลตฟอร์มใหม่ แอปส่วนใหญ่ใช้ AndroidX API ที่เข้ากันได้แบบย้อนหลัง
การอัปเดตนี้แสดงเส้นทางการย้ายข้อมูลเพื่อขัดจังหวะการนำทางย้อนกลับอย่างเหมาะสม ซึ่งเกี่ยวข้องกับการเปลี่ยนการขัดจังหวะการย้อนกลับจาก KeyEvent.KEYCODE_BACK
และคลาสที่มีเมธอด onBackPressed
เช่น Activity
และ Dialog
ด้วย Back API ของระบบใหม่
วิดีโอเกี่ยวกับ Codelab และ Google I/O
นอกเหนือจากการใช้เอกสารนี้ในหน้านี้แล้ว โปรดลองใช้ Codelab ซึ่งให้บริการการใช้งาน Use Case ทั่วไปของ WebView ที่จัดการท่าทางสัมผัสย้อนกลับแบบคาดการณ์โดยใช้ AndroidX Activity API
นอกจากนี้ คุณยังดูวิดีโอ Google I/O ของเราได้ด้วย ซึ่งจะแสดงตัวอย่างเพิ่มเติมในการใช้งาน AndroidX และ API ของแพลตฟอร์ม
อัปเดตแอปที่ใช้การนําทางกลับเริ่มต้น
การอัปเดตแอปเพื่อสนับสนุนฟีเจอร์นี้นั้นทำได้ง่ายกว่าหากแอปไม่ได้ใช้ลักษณะการย้อนกลับที่กำหนดเอง (กล่าวคือ แอปปล่อยให้ระบบกลับมาทำงานอีกครั้ง) เลือกใช้ฟีเจอร์นี้ตามที่อธิบายไว้ในคู่มือนี้
หากแอปใช้ Fragments หรือคอมโพเนนต์การนำทาง ให้อัปเกรดเป็น AndroidX Activity 1.6.0-alpha05 ขึ้นไปด้วย
อัปเดตแอปที่ใช้การนําทางกลับที่กําหนดเอง
หากแอปใช้ลักษณะการกดย้อนกลับที่กำหนดเอง เส้นทางการย้ายข้อมูลจะแตกต่างกันไป โดยขึ้นอยู่กับว่าแอปใช้ AndroidX หรือไม่ และจัดการการนำทางกลับอย่างไร
แอปของคุณใช้ AndroidX | วิธีที่แอปจัดการการนําทางกลับ | เส้นทางการย้ายข้อมูลที่แนะนํา (ลิงก์ในหน้านี้) |
ใช่ | API ของ AndroidX | ย้ายข้อมูลการติดตั้งใช้งาน AndroidX ที่มีอยู่กลับ |
API ของแพลตฟอร์มที่ไม่รองรับ | ย้ายข้อมูลแอป AndroidX ซึ่งมี API การนำทางกลับที่ไม่รองรับไปยัง AndroidX API | |
ไม่ | API ของแพลตฟอร์มที่ไม่รองรับ แต่ย้ายข้อมูลได้ | ย้ายข้อมูลแอปที่ใช้ API การนําทางกลับที่ไม่รองรับไปยัง API ของแพลตฟอร์ม |
API ของแพลตฟอร์มที่ไม่รองรับ แต่ย้ายข้อมูลไม่ได้ | เลื่อนการเลือกรับจนกว่าฟีเจอร์นี้จะกลายเป็นฟีเจอร์ที่ต้องใช้งาน |
ย้ายข้อมูลการใช้งานการนําทางกลับของ AndroidX
Use Case นี้พบบ่อยที่สุด (และแนะนํามากที่สุด) ซึ่งมีผลกับแอปใหม่หรือแอปที่มีอยู่ที่ใช้การจัดการการนำทางด้วยท่าทางสัมผัสที่กำหนดเองด้วย OnBackPressedDispatcher
ตามที่อธิบายไว้ในระบุการนําทางย้อนกลับที่กําหนดเอง
หากแอปของคุณจัดอยู่ในหมวดหมู่นี้ ให้ทำตามขั้นตอนต่อไปนี้เพื่อเพิ่มการรองรับท่าทางสัมผัสย้อนกลับแบบคาดการณ์
โปรดอัปเกรดเป็น AndroidX Activity 1.6.0-alpha05 เพื่อให้ API ที่ใช้
OnBackPressedDispatcher
API (เช่น ฟragment และคอมโพเนนต์การนำทาง) ทำงานร่วมกับท่าทางสัมผัสย้อนกลับแบบคาดการณ์ได้อย่างราบรื่น// In your build.gradle file: dependencies { // Add this in addition to your other dependencies implementation "androidx.activity:activity:1.6.0-alpha05"
เลือกใช้ท่าทางสัมผัสการย้อนกลับที่คาดการณ์ได้ตามที่อธิบายไว้ในหน้านี้
ย้ายข้อมูลแอป AndroidX ที่มี API การนำทางกลับที่ไม่รองรับไปยัง AndroidX API
หากแอปใช้ไลบรารี AndroidX แต่ติดตั้งใช้งานหรืออ้างอิง API การนำทางกลับที่ไม่รองรับ คุณจะต้องเปลี่ยนไปใช้ AndroidX API เพื่อรองรับลักษณะการทำงานใหม่
วิธีย้ายข้อมูล API ที่ไม่รองรับไปยัง AndroidX API
ย้ายข้อมูลตรรกะการจัดการ Back ของระบบไปยัง
OnBackPressedDispatcher
ของ AndroidX ด้วยการติดตั้งใช้งานOnBackPressedCallback
ดูคําแนะนําโดยละเอียดได้ที่หัวข้อระบุการนําทางกลับที่กําหนดเองปิดใช้
OnBackPressedCallback
เมื่อพร้อมที่จะหยุดขัดจังหวะท่าทางสัมผัสย้อนกลับหยุดการขัดจังหวะเหตุการณ์ Back ผ่าน
OnBackPressed
หรือKeyEvent.KEYCODE_BACK
อย่าลืมอัปเกรดเป็น AndroidX Activity 1.6.0-alpha05
// In your build.gradle file: dependencies { // Add this in addition to your other dependencies implementation "androidx.activity:activity:1.6.0-alpha05"
เมื่อย้ายข้อมูลแอปเรียบร้อยแล้ว ให้เลือกใช้ท่าทางสัมผัสการย้อนกลับแบบคาดการณ์ (ตามที่อธิบายไว้ในหน้านี้) เพื่อดูภาพเคลื่อนไหวของระบบเมื่อนำทางกลับบ้าน
ย้ายข้อมูลแอปที่ใช้ API การนําทางกลับที่ไม่รองรับไปยัง API ของแพลตฟอร์ม
หากแอปใช้ไลบรารี AndroidX ไม่ได้ แต่ใช้หรืออ้างอิงการนําทางกลับที่กําหนดเองโดยใช้ API ที่ไม่รองรับแทน คุณต้องย้ายข้อมูลไปยัง OnBackInvokedCallback
platform API
ทําตามขั้นตอนต่อไปนี้เพื่อย้ายข้อมูล API ที่ไม่รองรับไปยัง Platform API
ใช้
OnBackInvokedCallback
API ใหม่ในอุปกรณ์ที่ใช้ Android 13 ขึ้นไป และใช้ API ที่ไม่รองรับในอุปกรณ์ที่ใช้ Android 12 หรือต่ำกว่าลงทะเบียนตรรกะย้อนกลับที่กำหนดเองใน
OnBackInvokedCallback
ด้วยonBackInvokedDispatcher
วิธีนี้จะช่วยป้องกันไม่ให้กิจกรรมปัจจุบันเสร็จสิ้น และ Callback ของคุณจะมีโอกาสโต้ตอบกับการดำเนินการ "กลับ" เมื่อผู้ใช้ดำเนินการตามการนำทาง "กลับ" ของระบบจนเสร็จสิ้นยกเลิกการลงทะเบียน
OnBackInvokedCallback
เมื่อต้องการหยุดขัดจังหวะท่าทางสัมผัสเพื่อย้อนกลับ มิเช่นนั้น ผู้ใช้อาจเห็นลักษณะการทำงานที่ไม่พึงประสงค์เมื่อใช้การนําทางกลับของระบบ เช่น "ค้าง" ระหว่างมุมมองต่างๆ และบังคับให้ผู้ใช้ปิดแอปตัวอย่างวิธีย้ายข้อมูลตรรกะออกจาก
onBackPressed
มีดังนี้Kotlin
@Override fun onCreate() { if (BuildCompat.isAtLeastT()) { onBackInvokedDispatcher.registerOnBackInvokedCallback( OnBackInvokedDispatcher.PRIORITY_DEFAULT ) { /** * onBackPressed logic goes here. For instance: * Prevents closing the app to go home screen when in the * middle of entering data to a form * or from accidentally leaving a fragment with a WebView in it * * Unregistering the callback to stop intercepting the back gesture: * When the user transitions to the topmost screen (activity, fragment) * in the BackStack, unregister the callback by using * OnBackInvokeDispatcher.unregisterOnBackInvokedCallback * (https://developer.android.com/reference/kotlin/android/window/OnBackInvokedDispatcher#unregisteronbackinvokedcallback) */ } } }
Java
@Override void onCreate() { if (BuildCompat.isAtLeastT()) { getOnBackInvokedDispatcher().registerOnBackInvokedCallback( OnBackInvokedDispatcher.PRIORITY_DEFAULT, () -> { /** * onBackPressed logic goes here - For instance: * Prevents closing the app to go home screen when in the * middle of entering data to a form * or from accidentally leaving a fragment with a WebView in it * * Unregistering the callback to stop intercepting the back gesture: * When the user transitions to the topmost screen (activity, fragment) * in the BackStack, unregister the callback by using * OnBackInvokeDispatcher.unregisterOnBackInvokedCallback * (https://developer.android.com/reference/kotlin/android/view/OnBackInvokedDispatcher#unregisteronbackinvokedcallback) */ } ); } }
หยุดการสกัดกั้นเหตุการณ์ย้อนกลับผ่าน
OnBackPressed
หรือKeyEvent.KEYCODE_BACK
สำหรับ Android 13 ขึ้นไปเมื่อย้ายข้อมูลแอปเรียบร้อยแล้ว ให้เลือกใช้ท่าทางสัมผัสเพื่อย้อนกลับแบบคาดการณ์ (ตามที่อธิบายไว้ในหน้านี้) เพื่อให้
OnBackInvokedCallback
ใช้งานได้
คุณสามารถลงทะเบียน OnBackInvokedCallback
กับ PRIORITY_DEFAULT
หรือ PRIORITY_OVERLAY
ซึ่งไม่พร้อมใช้งานใน AndroidX OnBackPressedCallback
ที่คล้ายกัน การลงทะเบียนการโทรกลับด้วย PRIORITY_OVERLAY
จะมีประโยชน์ในบางกรณี
ซึ่งจะมีผลเมื่อคุณย้ายข้อมูลจาก onKeyPreIme()
และ Callback ของคุณต้องได้รับการจับมือกลับแทน IME ที่เปิดอยู่ IME จะลงทะเบียน Callback กับ PRIORITY_DEFAULT
เมื่อเปิด
ลงทะเบียนการเรียกกลับด้วย PRIORITY_OVERLAY
เพื่อให้แน่ใจว่า OnBackInvokedDispatcher
จะส่งท่าทางสัมผัสกลับไปยังการเรียกกลับแทน IME ที่เปิดอยู่
เลือกใช้ท่าทางสัมผัสการย้อนกลับที่คาดการณ์ได้
เมื่อตัดสินใจเลือกวิธีอัปเดตแอปตามกรณีของคุณแล้ว ให้เลือกใช้เพื่อรองรับท่าทางสัมผัสเพื่อย้อนกลับแบบคาดการณ์
หากต้องการเลือกใช้ ให้ตั้งค่า Flag android:enableOnBackInvokedCallback
เป็น true
ในแท็ก <application>
ของ AndroidManifest.xml
<application
...
android:enableOnBackInvokedCallback="true"
... >
...
</application>
หากไม่ระบุค่า ค่าเริ่มต้นจะเป็น false
และดำเนินการต่อไปนี้
- ปิดใช้ภาพเคลื่อนไหวของระบบสำหรับท่าทางสัมผัสย้อนกลับแบบคาดเดา
- ละเว้น
OnBackInvokedCallback
แต่การเรียกใช้OnBackPressedCallback
จะยังคงทำงานต่อไป
เลือกใช้ที่ระดับกิจกรรม
ตั้งแต่ Android 14 เป็นต้นไป Flag android:enableOnBackInvokedCallback
จะช่วยให้คุณเลือกใช้ภาพเคลื่อนไหวของระบบตามการคาดการณ์ที่ระดับกิจกรรมได้ การทำงานลักษณะนี้ทำให้ย้ายแอปกิจกรรมขนาดใหญ่ขนาดใหญ่ไปใช้ท่าทางสัมผัสย้อนกลับแบบคาดเดาได้มากขึ้น ด้วย Android 15 ฟีเจอร์การคาดคะเนกลับจะไม่ได้อยู่หลังตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์อีกต่อไป แอปสามารถเลือกใช้การกดย้อนกลับแบบคาดการณ์ได้ทั้งหมดหรือในระดับกิจกรรม
โค้ดต่อไปนี้แสดงตัวอย่างการใช้ enableOnBackInvokedCallback
เพื่อเปิดใช้ภาพเคลื่อนไหวของระบบที่กลับไปยังหน้าแรกจาก MainActivity
<manifest ...>
<application . . .
android:enableOnBackInvokedCallback="false">
<activity
android:name=".MainActivity"
android:enableOnBackInvokedCallback="true"
...
</activity>
<activity
android:name=".SecondActivity"
android:enableOnBackInvokedCallback="false"
...
</activity>
</application>
</manifest>
ในตัวอย่างก่อนหน้านี้ การตั้งค่า android:enableOnBackInvokedCallback=true
for
".SecondActivity"
จะเปิดใช้ภาพเคลื่อนไหวของระบบข้ามกิจกรรม
โปรดคำนึงถึงข้อควรพิจารณาต่อไปนี้เมื่อใช้ Flag android:enableOnBackInvokedCallback
- การตั้งค่า
android:enableOnBackInvokedCallback=false
จะปิดภาพเคลื่อนไหวย้อนกลับแบบคาดการณ์ที่ระดับกิจกรรมหรือที่ระดับแอป ทั้งนี้ขึ้นอยู่กับตำแหน่งที่คุณกำหนดแท็ก และสั่งระบบให้ละเว้นการเรียกไปยัง API ของแพลตฟอร์มOnBackInvokedCallback
อย่างไรก็ตาม การเรียกOnBackPressedCallback
จะยังคงทํางานต่อไปเนื่องจากOnBackPressedCallback
เข้ากันได้แบบย้อนหลังและเรียกใช้onBackPressed
API ซึ่งระบบไม่รองรับก่อน Android 13 - การตั้งค่า Flag
enableOnBackInvokedCallback
ที่ระดับแอปจะกำหนดค่าเริ่มต้นสำหรับทุกกิจกรรมในแอป คุณลบล้างค่าเริ่มต้นต่อกิจกรรมได้โดยการตั้งค่า Flag ที่ระดับกิจกรรมดังที่แสดงในตัวอย่างโค้ดก่อนหน้านี้
แนวทางปฏิบัติแนะนำสำหรับการติดต่อกลับ
แนวทางปฏิบัติแนะนำในการใช้ระบบการเรียกกลับจากระบบที่รองรับมีดังนี้
BackHandler
(สำหรับเขียน), OnBackPressedCallback
หรือ
OnBackInvokedCallback
ระบุสถานะ UI ที่เปิดและปิดใช้การเรียกกลับแต่ละรายการ
สถานะ UI เป็นพร็อพเพอร์ตี้ที่อธิบาย UI เราขอแนะนําให้ทําตามขั้นตอนระดับสูงเหล่านี้
ระบุสถานะ UI ที่เปิดและปิดใช้การเรียกกลับแต่ละรายการ
กําหนดสถานะนั้นโดยใช้ประเภทตัวเก็บข้อมูลที่เฝ้าสังเกตได้ เช่น
StateFlow
หรือ Compose State และเปิดหรือปิดใช้การเรียกกลับเมื่อสถานะเปลี่ยนแปลง
หากก่อนหน้านี้แอปของคุณเชื่อมโยงตรรกะการกดกลับกับคำสั่งเงื่อนไข การดำเนินการนี้อาจหมายความว่าคุณกำลังตอบสนองต่อเหตุการณ์การกดกลับหลังจากที่เหตุการณ์ดังกล่าวเกิดขึ้นแล้ว หลีกเลี่ยงรูปแบบนี้เมื่อมี Callback ที่ใหม่กว่า หากเป็นไปได้ ให้ย้าย Callback ออกไปนอกคำสั่งแบบมีเงื่อนไข และเชื่อมโยง Callback กับประเภทผู้ถือข้อมูลที่สังเกตได้แทน
ใช้การติดต่อกลับของระบบสำหรับตรรกะ UI
ตรรกะ UI กำหนดวิธีแสดง UI ใช้ Callback ของระบบเพื่อเรียกใช้ตรรกะ UI เช่น การแสดงป๊อปอัปหรือการเรียกใช้ภาพเคลื่อนไหว
หากแอปเปิดใช้การเรียกกลับระบบสำหรับการกดย้อนกลับ การเคลื่อนไหวแบบคาดเดาจะไม่ทำงานและคุณต้องจัดการเหตุการณ์การกดย้อนกลับ อย่าสร้างการเรียกกลับเพื่อเรียกใช้ตรรกะที่ไม่เกี่ยวข้องกับ UI เท่านั้น
เช่น หากคุณจะขัดขวางเหตุการณ์ Back เพื่อบันทึกเท่านั้น ให้บันทึกภายในวงจรของกิจกรรมหรือ Fragment แทน
- สําหรับกรณีกิจกรรมต่อกิจกรรมหรือกรณีจากเหตุการณ์ต่อกิจกรรม ให้บันทึกหาก
isFinishing
ภายในonDestroy
เป็นtrue
ภายในวงจรของกิจกรรม - สําหรับกรณีจากข้อมูลโค้ดหนึ่งไปยังอีกข้อมูลโค้ดหนึ่ง ให้บันทึกหาก
isRemoving
ภายในonDestroy
เป็นจริงภายในวงจรชีวิตของมุมมองข้อมูลโค้ด หรือบันทึกโดยใช้onBackStackChangeStarted
หรือonBackStackChangeCommitted
เมธอดภายในFragmentManager.OnBackStackChangedListener
สำหรับกรณี Compose ให้บันทึกภายในการเรียกกลับ onCleared()
ของ ViewModel
ที่เชื่อมโยงกับปลายทาง Compose นี่เป็นสัญญาณที่ดีที่สุดในการระบุว่ามีการนำปลายทางการเขียนออกจากกองซ้อนด้านหลังและทำลายแล้ว
สร้าง Callback ที่มีหน้าที่รับผิดชอบรายการเดียว
คุณสามารถเพิ่มการเรียกกลับหลายรายการลงในตัวจัดเตรียมได้ ระบบจะเพิ่มการเรียกกลับลงในกองซ้อน ซึ่งการเรียกกลับที่เปิดใช้ซึ่งเพิ่มล่าสุดจะจัดการท่าทางสัมผัสกลับครั้งถัดไป โดยมี 1 การเรียกกลับต่อท่าทางสัมผัสกลับ
การจัดการสถานะ "เปิดใช้" ของคอลแบ็กจะง่ายขึ้นหากคอลแบ็กดังกล่าวมีหน้าที่เพียงอย่างเดียว เช่น
รูปที่ 2 แสดงวิธีที่คุณสามารถมีคอลแบ็กหลายรายการในกอง โดยแต่ละรายการจะมีหน้าที่รับผิดชอบอย่างละอย่าง โค้ดเรียกซ้ำจะทำงานก็ต่อเมื่อปิดใช้โค้ดเรียกซ้ำที่อยู่เหนือในกองเท่านั้น ในตัวอย่างนี้ ระบบจะเปิดใช้การเรียกกลับ "คุณแน่ใจไหม..." เมื่อผู้ใช้ป้อนข้อมูลลงในแบบฟอร์ม และปิดใช้ในกรณีอื่นๆ การเรียกกลับจะเปิดกล่องโต้ตอบการยืนยันเมื่อผู้ใช้ปัดกลับเพื่อออกจากแบบฟอร์ม
แบ็กคอลอื่นๆ อาจรวมถึงคอมโพเนนต์ Material ที่รองรับการย้อนกลับแบบคาดการณ์ ทรานซิชัน AndroidX ที่ใช้ Progress API หรือแบ็กคอลที่กำหนดเองอื่นๆ
การทำงานของคอลแบ็กของ childFragmentManager
จะทำงานหากคอลแบ็กข้างต้นถูกปิดใช้และกองซ้อนที่ย้อนกลับสำหรับ FragmentManager
นี้ไม่ว่างเปล่า โดยที่ childFragmentManager
แนบอยู่ใน Fregment ในตัวอย่างนี้ จะมีการปิดใช้ Callback ภายใน
ในทำนองเดียวกัน Callback ภายในของ supportFragmentManager
จะทำงานหากปิดใช้ Callback ด้านบนและสแต็กไม่ว่างเปล่า ลักษณะการทำงานนี้มีความสอดคล้องกันเมื่อใช้ FragmentManager
หรือ NavigationComponent
เพื่อไปยังส่วนต่างๆ เนื่องจาก NavigationComponent
ต้องใช้ FragmentManager
ในตัวอย่างนี้ แคล็กแบ็กนี้จะทำงานหากผู้ใช้ไม่ได้ป้อนข้อความในแบบฟอร์ม ซึ่งทำให้แคล็กแบ็ก "คุณแน่ใจไหม..." ปิดอยู่
สุดท้าย super.onBackPressed()
คือ Callback ระดับระบบที่จะทำงานอีกครั้งหากปิดใช้ Callback ข้างต้น หากต้องการเรียกให้ภาพเคลื่อนไหวของระบบแสดง เช่น การกลับไปที่หน้าจอหลัก กิจกรรมข้ามแอป และงานข้ามแอป กองซ้อนของ supportFragmentManager
ต้องว่างเปล่าเพื่อให้การเรียกกลับภายในปิดอยู่
ทดสอบภาพเคลื่อนไหวของท่าทางสัมผัสการย้อนกลับแบบคาดเดา
หากยังใช้ Android 13 หรือ Android 14 อยู่ คุณจะทดสอบภาพเคลื่อนไหวของฟีเจอร์กลับไปที่หน้าแรกซึ่งแสดงในรูปที่ 1 ได้
หากต้องการทดสอบภาพเคลื่อนไหวนี้ ให้ทำตามขั้นตอนต่อไปนี้
ในอุปกรณ์ ให้ไปที่การตั้งค่า > ระบบ > ตัวเลือกสำหรับนักพัฒนาแอป
เลือกภาพเคลื่อนไหวย้อนกลับแบบคาดการณ์
เปิดแอปที่อัปเดตแล้วแล้วใช้ท่าทางสัมผัสการย้อนกลับเพื่อดูการทำงาน