การจัดการแป้นพิมพ์ที่ถอดออกได้

ไอคอนให้คะแนน 3 ดาว

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

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

แนวทางปฏิบัติแนะนำ

แอปที่ได้รับการเพิ่มประสิทธิภาพสำหรับหน้าจอขนาดใหญ่รองรับอุปกรณ์อินพุตทุกประเภท ตั้งแต่แป้นพิมพ์ซอฟต์แวร์และฮาร์ดแวร์ไปจนถึงสไตลัส เมาส์ แทร็กแพด และอุปกรณ์ต่อพ่วงอื่นๆ

การรองรับแป้นพิมพ์ภายนอกเกี่ยวข้องกับการเปลี่ยนแปลงการกำหนดค่า ซึ่งคุณสามารถ จัดการได้ 2 วิธีดังนี้

  1. ปล่อยให้ระบบสร้างกิจกรรมที่กำลังทำงานขึ้นมาใหม่ และคุณก็จัดการสถานะของแอป
  2. จัดการการเปลี่ยนแปลงการกำหนดค่าด้วยตนเอง (ระบบจะไม่สร้างกิจกรรมขึ้นใหม่) โดยทำดังนี้
    • ประกาศค่าการกำหนดค่าทั้งหมดที่เกี่ยวข้องกับแป้นพิมพ์
    • สร้างตัวแฮนเดิลการเปลี่ยนแปลงการกำหนดค่า

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

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

ใน Jetpack Compose คุณสามารถตอบสนองต่อการเปลี่ยนแปลงการกำหนดค่าแป้นพิมพ์ได้ 2 วิธี ดังนี้

  1. UI แบบรีแอ็กทีฟ: อ่านสถานะการกำหนดค่าปัจจุบันได้โดยตรงใน Composable โดยใช้ LocalConfiguration.current UI จะ จัดองค์ประกอบใหม่โดยอัตโนมัติเพื่อปรับให้เข้ากับสถานะใหม่เมื่อมีการต่อหรือ ถอดแป้นพิมพ์
  2. การเรียกกลับผลข้างเคียง: ใช้ DisposableEffect ที่รับรู้ถึงวงจรขององค์ประกอบเพื่อ ลงทะเบียนเครื่องมือฟังการเปลี่ยนแปลงการกำหนดค่าในกิจกรรมโฮสต์ ซึ่งช่วยให้ คุณทริกเกอร์เหตุการณ์ที่ไม่ใช่ UI (เช่น การบันทึกหรือการวิเคราะห์) ได้โดยไม่ต้องสร้าง กิจกรรมใหม่หรือสร้างอินสแตนซ์ขององค์ประกอบมุมมองจำลอง

ส่วนผสม

  • android:configChanges: แอตทริบิวต์ขององค์ประกอบ <activity> ในไฟล์ Manifest ของแอป แจ้งให้ระบบทราบเกี่ยวกับการเปลี่ยนแปลงการกำหนดค่าที่แอปจัดการ
  • LocalConfiguration: ผู้ให้บริการในเครื่องที่ประกอบกันได้ซึ่งแสดง Configuration ของอุปกรณ์ปัจจุบัน
  • DisposableEffect: API ผลข้างเคียงของ Compose ที่เรียกใช้บล็อกโค้ด เมื่อ Composable เข้าสู่การจัดองค์ประกอบ และล้างข้อมูลเมื่อออกจากองค์ประกอบ

ขั้นตอน

ประกาศแอตทริบิวต์ configChanges และเพิ่มค่าที่เกี่ยวข้องกับแป้นพิมพ์เพื่อป้องกัน การสร้างกิจกรรมใหม่ จากนั้นใช้ LocalConfiguration.current เพื่อ ปรับเลย์เอาต์ที่ประกอบได้แบบไดนามิก หรือลงทะเบียนเครื่องมือฟังการกำหนดค่า โดยใช้ DisposableEffect

1. ประกาศแอตทริบิวต์ configChanges

อัปเดตองค์ประกอบ <activity> ในไฟล์ Manifest ของแอปโดยเพิ่มค่า keyboard|keyboardHidden ลงในรายการการเปลี่ยนแปลงการกำหนดค่าที่มีการจัดการอยู่แล้ว

<activity
            android:configChanges="...|keyboard|keyboardHidden">

2. ตอบสนองต่อการเปลี่ยนแปลงการกำหนดค่าแป้นพิมพ์

หากต้องการจัดการการเปลี่ยนแปลงการกำหนดค่าใน Jetpack Compose ให้ใช้ตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้ โดยขึ้นอยู่กับว่าคุณกำลังอัปเดต UI หรือเรียกใช้โค้ดเรียกกลับของผลข้างเคียง

  • ตัวเลือก ก: UI แบบโต้ตอบ (แนะนำ)

    อ่านประเภทแป้นพิมพ์จาก LocalConfiguration.current โดยตรง เมื่อมีการแนบหรือถอดแป้นพิมพ์ฮาร์ดแวร์ ค่านี้จะเปลี่ยนไป และ Compose จะจัดองค์ประกอบ UI ใหม่โดยอัตโนมัติ

    val configuration = LocalConfiguration.current
    val isPhysicalKeyboardAttached = configuration.keyboard == Configuration.KEYBOARD_QWERTY
    
    if (isPhysicalKeyboardAttached) {
        // Render layout optimized for physical keyboard
    } else {
        // Render default layout
    }

  • ตัวเลือก ข: เครื่องมือตรวจสอบผลข้างเคียง

    หากต้องการเรียกใช้ผลข้างเคียง (เช่น การบันทึก การอัปเดตฐานข้อมูลในเครื่อง หรือการเรียกใช้ข้อมูลวิเคราะห์) เมื่อการกำหนดค่าเปลี่ยนแปลง ให้ใช้ DisposableEffect เพื่อลงทะเบียนเครื่องมือฟังการเปลี่ยนแปลงการกำหนดค่าในโฮสต์ ComponentActivity

    val context = LocalActivity.current
    DisposableEffect(context) {
        val activity = context as? ComponentActivity
        val listener = Consumer<Configuration> { newConfig ->
            val hasKeyboard = newConfig.keyboard == Configuration.KEYBOARD_QWERTY
            // Trigger non-UI actions, analytics, etc.
        }
        activity?.addOnConfigurationChangedListener(listener)
        onDispose {
            activity?.removeOnConfigurationChangedListener(listener)
        }
    }

ผลลัพธ์

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

แหล่งข้อมูลเพิ่มเติม

ดูวิธีบันทึกสถานะ UI ของแอปในระหว่างการเปลี่ยนแปลงการกำหนดค่า เช่น การติดหรือถอดคีย์บอร์ด ได้ที่บันทึกสถานะ UI