เพิ่มการรองรับท่าทางสัมผัสการย้อนกลับที่คาดการณ์ได้

รูปที่ 1 ภาพตัวอย่างลักษณะของท่าทางสัมผัสเพื่อย้อนกลับแบบคาดการณ์ในโทรศัพท์

ฟีเจอร์การนําทางด้วยท่าทางสัมผัส "กลับโดยประมาณ" ช่วยให้ผู้ใช้ดูตัวอย่างตําแหน่งที่การปัดกลับจะนําไป

เช่น การใช้ท่าทางสัมผัสเพื่อกลับอาจแสดงตัวอย่างภาพเคลื่อนไหวของหน้าจอหลักที่อยู่เบื้องหลังแอป ดังที่แสดงในภาพตัวอย่างในรูปที่ 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 ของแพลตฟอร์มที่ไม่รองรับ แต่ย้ายข้อมูลไม่ได้ เลือกไม่ใช้ชั่วคราวโดยตั้งค่าแอตทริบิวต์ android:enableOnBackInvokedCallback เป็น false ในแท็ก <application> หรือ <activity> ของไฟล์ AndroidManifest.xml ของแอป

ย้ายข้อมูลการใช้งานการนําทางกลับของ AndroidX

กรณีการใช้งานนี้พบได้บ่อยที่สุด (และแนะนํามากที่สุด) ซึ่งมีผลกับแอปใหม่หรือแอปที่มีอยู่ที่ใช้การจัดการการไปยังส่วนต่างๆ ด้วยท่าทางสัมผัสที่กำหนดเองด้วย OnBackPressedDispatcher ตามที่อธิบายไว้ในระบุการไปยังส่วนต่างๆ ย้อนกลับที่กำหนดเอง

โปรดอัปเกรดเป็น AndroidX Activity 1.6.0-alpha05 เพื่อให้ API ที่ใช้ OnBackPressedDispatcher (เช่น ฟragment และคอมโพเนนต์การนำทาง) ทํางานร่วมกับท่าทางสัมผัสเพื่อกลับโดยประมาณได้อย่างราบรื่น

```xml
// 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

  1. ย้ายข้อมูลตรรกะการจัดการ Back ของระบบไปยัง OnBackPressedDispatcher ของ AndroidX ด้วยการติดตั้งใช้งาน OnBackPressedCallback ดูคําแนะนําโดยละเอียดได้ที่หัวข้อระบุการนําทางกลับที่กําหนดเอง

  2. ปิดใช้ OnBackPressedCallback เมื่อพร้อมที่จะหยุดขัดจังหวะท่าทางสัมผัสย้อนกลับ

  3. หยุดการขัดจังหวะเหตุการณ์ Back ผ่าน OnBackPressed หรือ KeyEvent.KEYCODE_BACK

  4. อย่าลืมอัปเกรดเป็น 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

  1. ใช้ OnBackInvokedCallback API ใหม่ในอุปกรณ์ที่ใช้ Android 13 ขึ้นไป และใช้ API ที่ระบบไม่รองรับในอุปกรณ์ที่ใช้ Android 12 หรือต่ำกว่า

  2. ลงทะเบียนตรรกะการย้อนกลับที่กำหนดเองใน OnBackInvokedCallback ด้วย onBackInvokedDispatcher ซึ่งจะป้องกันไม่ให้กิจกรรมปัจจุบันเสร็จสมบูรณ์ และเพื่อให้การเรียกกลับมีโอกาสตอบสนองต่อการดำเนินการ "กลับ" เมื่อผู้ใช้ไปยังส่วนต่างๆ ของระบบโดยกด "กลับ" จนเสร็จสมบูรณ์

  3. ยกเลิกการลงทะเบียน 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)
               */
            }
        );
      }
    }
  4. หยุดสกัดกั้นเหตุการณ์ "กลับ" โดยใช้ OnBackPressed หรือ KeyEvent.KEYCODE_BACK สําหรับ Android 13 ขึ้นไป

คุณสามารถลงทะเบียน OnBackInvokedCallback กับ PRIORITY_DEFAULT หรือ PRIORITY_OVERLAY ซึ่งไม่พร้อมใช้งานใน AndroidX OnBackPressedCallback ที่คล้ายกัน การลงทะเบียนการโทรกลับด้วย PRIORITY_OVERLAY จะมีประโยชน์ในบางกรณี

ซึ่งจะมีผลเมื่อคุณย้ายข้อมูลจาก onKeyPreIme() และ Callback ของคุณต้องรับท่าทางสัมผัส "กลับ" แทน IME ที่เปิดอยู่ IME จะลงทะเบียนการเรียกกลับกับ PRIORITY_DEFAULT เมื่อเปิด ลงทะเบียนการเรียกกลับกับ PRIORITY_OVERLAY เพื่อให้ OnBackInvokedDispatcher ส่งท่าทางสัมผัสกลับไปยังการเรียกกลับแทน IME ที่เปิดอยู่

เลือกไม่ใช้การย้อนกลับที่คาดการณ์ได้

หากต้องการเลือกไม่ใช้ ให้ตั้งค่า Flag android:enableOnBackInvokedCallback เป็น false ในแท็ก <application> ของ AndroidManifest.xml

<application
    ...
    android:enableOnBackInvokedCallback="false"
    ... >
...
</application>

การตั้งค่านี้เป็น "เท็จ" จะทําสิ่งต่อไปนี้

  • ปิดใช้ภาพเคลื่อนไหวของระบบสำหรับท่าทางสัมผัสย้อนกลับแบบคาดเดา
  • ไม่สนใจ OnBackInvokedCallback แต่การเรียกใช้ OnBackPressedCallback จะยังคงทำงานต่อไป

เลือกไม่ใช้ที่ระดับกิจกรรม

ตั้งแต่ Android 16 เป็นต้นไป Flag android:enableOnBackInvokedCallback จะช่วยให้คุณเลือกไม่ใช้ภาพเคลื่อนไหวของระบบตามการคาดการณ์ที่ระดับกิจกรรมได้ ลักษณะการทำงานนี้ช่วยให้ย้ายข้อมูลแอปขนาดใหญ่ที่มีหลายกิจกรรมไปยังท่าทางสัมผัสย้อนกลับแบบคาดการณ์ได้ง่ายขึ้น

โค้ดต่อไปนี้แสดงตัวอย่าง 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>

โปรดคำนึงถึงข้อควรพิจารณาต่อไปนี้เมื่อใช้ Flag android:enableOnBackInvokedCallback

  • การตั้งค่า android:enableOnBackInvokedCallback=false จะปิดภาพเคลื่อนไหวย้อนกลับแบบคาดการณ์ที่ระดับกิจกรรมหรือระดับแอป โดยขึ้นอยู่กับตําแหน่งที่คุณตั้งค่าแท็ก และสั่งให้ระบบละเว้นการเรียกใช้ API ของแพลตฟอร์ม OnBackInvokedCallback อย่างไรก็ตาม การเรียกใช้ OnBackPressedCallback จะยังคงทำงานต่อไปเนื่องจาก OnBackPressedCallback เข้ากันได้แบบย้อนหลังและเรียกใช้ API onBackPressed ซึ่งระบบไม่รองรับก่อน Android 13
  • การตั้งค่า Flag enableOnBackInvokedCallback ที่ระดับแอปจะกำหนดค่าเริ่มต้นสำหรับกิจกรรมทั้งหมดในแอป คุณสามารถลบล้างค่าเริ่มต้นต่อกิจกรรมได้โดยการตั้งค่า Flag ที่ระดับกิจกรรม ดังที่แสดงในตัวอย่างโค้ดก่อนหน้า

แนวทางปฏิบัติแนะนำสำหรับการติดต่อกลับ

แนวทางปฏิบัติแนะนำสำหรับการใช้ระบบการเรียกกลับจากระบบที่รองรับ ได้แก่ BackHandler (สำหรับเขียน), OnBackPressedCallback หรือ OnBackInvokedCallback

ระบุสถานะ UI ที่เปิดและปิดใช้การเรียกกลับแต่ละรายการ

สถานะ UI เป็นพร็อพเพอร์ตี้ที่อธิบาย UI เราขอแนะนําให้ทําตามขั้นตอนระดับสูงเหล่านี้

  1. ระบุสถานะ UI ที่เปิดและปิดใช้การเรียกกลับแต่ละรายการ

  2. กําหนดสถานะนั้นโดยใช้ประเภทตัวเก็บข้อมูลที่เฝ้าสังเกตได้ เช่น StateFlow หรือ Compose State และเปิดหรือปิดใช้การเรียกกลับเมื่อสถานะมีการเปลี่ยนแปลง

หากก่อนหน้านี้แอปของคุณเชื่อมโยงตรรกะการกดกลับกับคำสั่งเงื่อนไข การดำเนินการนี้อาจหมายความว่าคุณกำลังตอบสนองต่อเหตุการณ์การกดกลับหลังจากที่เหตุการณ์ดังกล่าวเกิดขึ้นแล้ว หลีกเลี่ยงรูปแบบนี้กับคอลแบ็กเวอร์ชันใหม่ หากเป็นไปได้ ให้ย้ายการเรียกกลับไว้นอกคำสั่งเงื่อนไขและเชื่อมโยงการเรียกกลับกับประเภทตัวเก็บข้อมูลแบบสังเกตได้แทน

ใช้การเรียกกลับระบบสําหรับตรรกะ UI

ตรรกะ UI กำหนดวิธีแสดง UI ใช้การเรียกกลับเมื่อระบบย้อนกลับเพื่อเรียกใช้ตรรกะ UI เช่น การแสดงป๊อปอัปหรือเรียกใช้ภาพเคลื่อนไหว

หากแอปเปิดใช้การเรียกกลับระบบสำหรับการกดย้อนกลับ การเคลื่อนไหวแบบคาดเดาจะไม่ทำงานและคุณต้องจัดการเหตุการณ์การกดย้อนกลับ อย่าสร้างการเรียกกลับเพื่อเรียกใช้ตรรกะที่ไม่เกี่ยวข้องกับ UI เท่านั้น

เช่น หากคุณจะขัดจังหวะเหตุการณ์ Back เพื่อบันทึกเท่านั้น ให้บันทึกภายในวงจรของกิจกรรมหรือ Fragment แทน

  • สําหรับกรณีกิจกรรมต่อกิจกรรมหรือกรณีจากเหตุการณ์ต่อกิจกรรม ให้บันทึกหาก isFinishing ภายใน onDestroy เป็น true ภายในวงจรของกิจกรรม
  • สําหรับกรณีจากข้อมูลโค้ดหนึ่งไปยังอีกข้อมูลโค้ดหนึ่ง ให้บันทึกหาก isRemoving ภายใน onDestroy เป็นจริงภายในวงจรชีวิตของมุมมองข้อมูลโค้ด หรือเข้าสู่ระบบโดยใช้วิธี onBackStackChangeStarted หรือ onBackStackChangeCommitted ภายใน FragmentManager.OnBackStackChangedListener

สําหรับเคสการเขียน ให้บันทึกภายในการเรียกกลับ onCleared() ของ ViewModel ที่เชื่อมโยงกับปลายทางการเขียน นี่เป็นสัญญาณที่ดีที่สุดในการระบุว่ามีการนำปลายทางการเขียนออกจากกองซ้อนด้านหลังและทำลายแล้ว

สร้างการเรียกกลับที่มีความรับผิดชอบเดียว

คุณเพิ่มการเรียกกลับหลายรายการลงในตัวจัดเตรียมได้ ระบบจะเพิ่มการเรียกกลับลงในกองซ้อน ซึ่งการเรียกกลับที่เปิดใช้ซึ่งเพิ่มล่าสุดจะจัดการท่าทางสัมผัสกลับครั้งถัดไป โดยมี 1 การเรียกกลับต่อท่าทางสัมผัสกลับ

การจัดการสถานะ "เปิดใช้" ของคอลแบ็กจะง่ายขึ้นหากคอลแบ็กดังกล่าวมีหน้าที่เพียงอย่างเดียว เช่น

การจัดลําดับของคอลแบ็กในสแต็ก
รูปที่ 2 แผนภาพสแต็กการเรียกกลับ

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

แบ็กคอลอื่นๆ อาจรวมถึงคอมโพเนนต์ Material ที่รองรับการย้อนกลับแบบคาดการณ์ ทรานซิชัน AndroidX ที่ใช้ Progress API หรือแบ็กคอลที่กำหนดเองอื่นๆ

การทำงานของคอลแบ็กของ childFragmentManager จะทำงานหากคอลแบ็กข้างต้นถูกปิดใช้และกองซ้อนที่ย้อนกลับสำหรับ FragmentManager นี้ไม่ว่างเปล่า โดยที่ childFragmentManager แนบอยู่ใน Fregment ในตัวอย่างนี้ แคล็กแบ็กภายในนี้ปิดอยู่

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

สุดท้าย super.onBackPressed() คือการเรียกกลับระดับระบบที่จะทํางานอีกครั้งหากการเรียกกลับข้างต้นปิดอยู่ หากต้องการเรียกให้ภาพเคลื่อนไหวของระบบแสดง เช่น การกลับไปที่หน้าจอหลัก กิจกรรมข้ามแอป และงานข้ามแอป กองซ้อนของ supportFragmentManager ต้องว่างเปล่าเพื่อให้การเรียกกลับภายในปิดอยู่

ทดสอบภาพเคลื่อนไหวของท่าทางสัมผัสการย้อนกลับแบบคาดเดา

หากยังใช้ Android 13 หรือ Android 14 อยู่ คุณจะทดสอบภาพเคลื่อนไหวของฟีเจอร์กลับไปที่หน้าแรกซึ่งแสดงในรูปที่ 1 ได้

หากต้องการทดสอบภาพเคลื่อนไหวนี้ ให้ทำตามขั้นตอนต่อไปนี้

  1. ในอุปกรณ์ ให้ไปที่การตั้งค่า > ระบบ > ตัวเลือกสำหรับนักพัฒนาแอป

  2. เลือกการเคลื่อนไหวย้อนกลับแบบคาดเดา

  3. เปิดแอปที่อัปเดตแล้ว และใช้ท่าทางสัมผัสเพื่อดูการทํางาน