การรองรับแป้นพิมพ์แบบถอดออกได้ช่วยเพิ่มประสิทธิภาพการทำงานของผู้ใช้ในอุปกรณ์หน้าจอขนาดใหญ่ Android จะทริกเกอร์การเปลี่ยนแปลงการกำหนดค่าทุกครั้งที่มีการ ต่อหรือถอดแป้นพิมพ์ออกจากอุปกรณ์ ซึ่งอาจทำให้สถานะ UI สูญหาย แอปของคุณสามารถบันทึกและกู้คืนสถานะเพื่อให้ระบบจัดการการสร้างกิจกรรมใหม่ หรือจำกัดการสร้างกิจกรรมใหม่สำหรับการเปลี่ยนแปลงการกำหนดค่าแป้นพิมพ์
ในทุกกรณี ข้อมูลทั้งหมดที่เกี่ยวข้องกับคีย์บอร์ดจะจัดเก็บไว้ในออบเจ็กต์ Configuration
ฟิลด์ keyboard และ keyboardHidden ของออบเจ็กต์การกำหนดค่า
มีข้อมูลเกี่ยวกับประเภทของคีย์บอร์ดและความพร้อมใช้งาน
แนวทางปฏิบัติแนะนำ
แอปที่ได้รับการเพิ่มประสิทธิภาพสำหรับหน้าจอขนาดใหญ่รองรับอุปกรณ์อินพุตทุกประเภท ตั้งแต่แป้นพิมพ์ซอฟต์แวร์และฮาร์ดแวร์ไปจนถึงสไตลัส เมาส์ แทร็กแพด และอุปกรณ์ต่อพ่วงอื่นๆ
การรองรับแป้นพิมพ์ภายนอกเกี่ยวข้องกับการเปลี่ยนแปลงการกำหนดค่า ซึ่งคุณสามารถ จัดการได้ 2 วิธีดังนี้
- ปล่อยให้ระบบสร้างกิจกรรมที่กำลังทำงานขึ้นมาใหม่ และคุณก็จัดการสถานะของแอป
- จัดการการเปลี่ยนแปลงการกำหนดค่าด้วยตนเอง (ระบบจะไม่สร้างกิจกรรมขึ้นใหม่) โดยทำดังนี้
- ประกาศค่าการกำหนดค่าทั้งหมดที่เกี่ยวข้องกับแป้นพิมพ์
- สร้างตัวแฮนเดิลการเปลี่ยนแปลงการกำหนดค่า
แอปเพิ่มประสิทธิภาพซึ่งมักต้องมีการควบคุม UI อย่างละเอียดสำหรับการป้อนข้อความและ การป้อนข้อมูลอื่นๆ จะได้รับประโยชน์จากแนวทางการจัดการ การเปลี่ยนแปลงการกำหนดค่าด้วยตนเอง
ในกรณีพิเศษ คุณอาจต้องการเปลี่ยนเลย์เอาต์ของแอปเมื่อต่อหรือถอดคีย์บอร์ดฮาร์ดแวร์ออก เช่น เพื่อเพิ่มพื้นที่สำหรับเครื่องมือหรือหน้าต่างแก้ไข
ใน Jetpack Compose คุณสามารถตอบสนองต่อการเปลี่ยนแปลงการกำหนดค่าแป้นพิมพ์ได้ 2 วิธี ดังนี้
- UI แบบรีแอ็กทีฟ: อ่านสถานะการกำหนดค่าปัจจุบันได้โดยตรงใน Composable โดยใช้
LocalConfiguration.currentUI จะ จัดองค์ประกอบใหม่โดยอัตโนมัติเพื่อปรับให้เข้ากับสถานะใหม่เมื่อมีการต่อหรือ ถอดแป้นพิมพ์ - การเรียกกลับผลข้างเคียง: ใช้
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เพื่อลงทะเบียนเครื่องมือฟังการเปลี่ยนแปลงการกำหนดค่าในโฮสต์ComponentActivityval 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