แม้ว่าแอป Android TV จำนวนมากจะสร้างด้วยคอมโพเนนต์ของ Android ที่มาพร้อมเครื่อง ควรคำนึงถึงความสามารถเข้าถึงได้ง่ายของบุคคลที่สาม ของเฟรมเวิร์กหรือคอมโพเนนต์ โดยเฉพาะเมื่อใช้มุมมองที่กำหนดเอง
คอมโพเนนต์มุมมองที่กำหนดเองซึ่งเชื่อมต่อกับ OpenGL หรือ Canvas โดยตรงอาจทำงานได้ไม่ดี ด้วยบริการการช่วยเหลือพิเศษ เช่น TalkBack และการเข้าถึงด้วยสวิตช์
พิจารณาปัญหาต่อไปนี้ที่อาจเกิดขึ้นเมื่อมีการเปลี่ยน TalkBack ใน:
- โฟกัสการช่วยเหลือพิเศษ (สี่เหลี่ยมผืนผ้าสีเขียว) อาจหายไปในแอป
- โฟกัสการช่วยเหลือพิเศษอาจเลือกขอบเขตของทั้งหน้าจอ
- โฟกัสการช่วยเหลือพิเศษอาจย้ายไม่ได้
- ปุ่มทิศทาง 4 ทิศทางบน D-pad อาจไม่ส่งผลใดๆ แม้ว่าโค้ดของคุณจะจัดการอยู่ก็ตาม
หากพบปัญหาเหล่านี้ในแอป ให้ตรวจสอบว่า
แสดง AccessibilityNodeInfo
ต้นไม้สำหรับบริการการช่วยเหลือพิเศษ
ส่วนที่เหลือของคู่มือนี้จะอธิบายวิธีแก้ไขและแนวทางปฏิบัติแนะนำในการแก้ไขปัญหาเหล่านี้
บริการการช่วยเหลือพิเศษจะดูแลจัดการเหตุการณ์ D-pad
สาเหตุของปัญหานี้คือการช่วยเหลือพิเศษใช้เหตุการณ์สําคัญ บริการต่างๆ
ดังที่แสดงในรูปที่ 1 เมื่อ TalkBack เปิดอยู่ เหตุการณ์ D-pad ไม่ได้ส่งไปยังตัวแฮนเดิล D-pad ที่นักพัฒนาซอฟต์แวร์กำหนดไว้ แต่ บริการการช่วยเหลือพิเศษจะได้รับเหตุการณ์สำคัญเพื่อให้ย้าย โฟกัสการช่วยเหลือพิเศษ เนื่องจากคอมโพเนนต์ Android ที่กำหนดเองจะไม่แสดงโดยค่าเริ่มต้น ข้อมูลเกี่ยวกับบริการช่วยเหลือพิเศษเกี่ยวกับตำแหน่งบนหน้าจอ บริการการช่วยเหลือพิเศษจะย้ายโฟกัสการช่วยเหลือพิเศษเพื่อไฮไลต์บริการไม่ได้
บริการการเข้าถึงอื่นๆ ก็ได้รับผลกระทบคล้ายๆ กัน เช่น เหตุการณ์ D-pad ก็อาจได้รับผลกระทบด้วย ใช้เมื่อใช้การเข้าถึงด้วยสวิตช์
เนื่องจากมีการส่งเหตุการณ์ D-pad ไปยังบริการการช่วยเหลือพิเศษ และ
บริการนั้นจะไม่รู้ว่าคอมโพเนนต์ UI อยู่ตรงไหนในมุมมองที่กำหนดเอง
คุณต้องใช้ AccessibilityNodeInfo
เพื่อให้แอปส่งต่อ
เหตุการณ์สำคัญได้อย่างถูกต้อง
แสดงข้อมูลต่อบริการการช่วยเหลือพิเศษ
หากต้องการให้บริการการช่วยเหลือพิเศษด้วยข้อมูลที่เพียงพอเกี่ยวกับ
ตำแหน่งและคำอธิบายของมุมมองที่กำหนดเอง ใช้ AccessibilityNodeInfo
เพื่อแสดงรายละเอียดของแต่ละคอมโพเนนต์
ในการกำหนดความสัมพันธ์เชิงตรรกะของมุมมองเพื่อให้บริการการเข้าถึงสามารถ
จัดการสิ่งที่มุ่งเน้น, ใช้ ExploreByTouchHelper
และตั้งค่าโดยใช้
ViewCompat.setAccessibilityDelegate(View, AccessibilityDelegateCompat)
สำหรับมุมมองที่กำหนดเอง
เมื่อใช้งาน ExploreByTouchHelper
ให้ลบล้างเมธอดนามธรรม 4 วิธีต่อไปนี้
Kotlin
// Return the virtual view ID whose view is covered by the input point (x, y). protected fun getVirtualViewAt(x: Float, y: Float): Int // Fill the virtual view ID list into the input parameter virtualViewIds. protected fun getVisibleVirtualViews(virtualViewIds: List<Int>) // For the view whose virtualViewId is the input virtualViewId, populate the // accessibility node information into the AccessibilityNodeInfoCompat parameter. protected fun onPopulateNodeForVirtualView(virtualViewId: Int, @NonNull node: AccessibilityNodeInfoCompat) // Set the accessibility handling when perform action. protected fun onPerformActionForVirtualView(virtualViewId: Int, action: Int, @Nullable arguments: Bundle): Boolean
Java
// Return the virtual view ID whose view is covered by the input point (x, y). protected int getVirtualViewAt(float x, float y) // Fill the virtual view ID list into the input parameter virtualViewIds. protected void getVisibleVirtualViews(List<Integer> virtualViewIds) // For the view whose virtualViewId is the input virtualViewId, populate the // accessibility node information into the AccessibilityNodeInfoCompat parameter. protected void onPopulateNodeForVirtualView(int virtualViewId, @NonNull AccessibilityNodeInfoCompat node) // Set the accessibility handling when perform action. protected boolean onPerformActionForVirtualView(int virtualViewId, int action, @Nullable Bundle arguments)
สำหรับรายละเอียดเพิ่มเติม โปรดดู Google I/O 2013 - การเปิดใช้คนตาบอดและสายตาเลือนราง การช่วยเหลือพิเศษใน Android หรืออ่านเพิ่มเติมเกี่ยวกับการป้อนข้อมูลกิจกรรมการช่วยเหลือพิเศษ
แนวทางปฏิบัติแนะนำ
จำเป็น:
AccessibilityNodeInfo.getBoundsInScreen()
ต้องกำหนดตำแหน่งของคอมโพเนนต์จำเป็น:
AccessibilityNodeInfo.setVisibleToUser()
ต้องแสดงถึงการเปิดเผยของคอมโพเนนต์จำเป็น:
AccessibilityNodeInfo.getContentDescription()
ต้องระบุคำอธิบายเนื้อหาเพื่อให้ TalkBack ประกาศระบุ
AccessibilityNodeInfo.setClassName()
เพื่อให้บริการแยกแยะประเภทของคอมโพเนนต์ได้เมื่อใช้
performAction()
แสดงการดำเนินการโดยใช้AccessibilityEvent
ที่เกี่ยวข้องหากต้องการใช้ประเภทการทำงานเพิ่มเติม เช่น
ACTION_CLICK
ให้เรียกใช้AccessibilityNodeInfo.addAction(ACTION_CLICK)
โดยใช้ตรรกะที่เกี่ยวข้องในperformAction()
ให้แสดงสถานะคอมโพเนนต์ของ
setFocusable()
(หากมี)setClickable()
setScrollable()
และวิธีการที่คล้ายกันตรวจสอบเอกสารสำหรับ
AccessibilityNodeInfo
ระบุวิธีอื่นๆ ที่จะทำให้บริการการช่วยเหลือพิเศษต่างๆ สามารถโต้ตอบ คอมโพเนนต์ของคุณ
ตัวอย่าง
ดูตัวอย่างการช่วยเหลือพิเศษในมุมมองที่กำหนดเองสำหรับ Android TV เพื่อดูแนวทางปฏิบัติแนะนำสำหรับ เพิ่มการสนับสนุนการช่วยเหลือพิเศษลงในแอปที่ใช้มุมมองที่กำหนดเอง