การสนับสนุนการช่วยเหลือพิเศษเกี่ยวกับมุมมองที่กำหนดเองบน Android TV

แม้ว่าแอป Android TV จำนวนมากจะสร้างด้วยคอมโพเนนต์ของ Android ที่มาพร้อมเครื่อง ควรคำนึงถึงความสามารถเข้าถึงได้ง่ายของบุคคลที่สาม ของเฟรมเวิร์กหรือคอมโพเนนต์ โดยเฉพาะเมื่อใช้มุมมองที่กำหนดเอง

คอมโพเนนต์มุมมองที่กำหนดเองซึ่งเชื่อมต่อกับ OpenGL หรือ Canvas โดยตรงอาจทำงานได้ไม่ดี ด้วยบริการการช่วยเหลือพิเศษ เช่น TalkBack และการเข้าถึงด้วยสวิตช์

พิจารณาปัญหาต่อไปนี้ที่อาจเกิดขึ้นเมื่อมีการเปลี่ยน TalkBack ใน:

  • โฟกัสการช่วยเหลือพิเศษ (สี่เหลี่ยมผืนผ้าสีเขียว) อาจหายไปในแอป
  • โฟกัสการช่วยเหลือพิเศษอาจเลือกขอบเขตของทั้งหน้าจอ
  • โฟกัสการช่วยเหลือพิเศษอาจย้ายไม่ได้
  • ปุ่มทิศทาง 4 ทิศทางบน D-pad อาจไม่ส่งผลใดๆ แม้ว่าโค้ดของคุณจะจัดการอยู่ก็ตาม

หากพบปัญหาเหล่านี้ในแอป ให้ตรวจสอบว่า แสดง AccessibilityNodeInfo ต้นไม้สำหรับบริการการช่วยเหลือพิเศษ

ส่วนที่เหลือของคู่มือนี้จะอธิบายวิธีแก้ไขและแนวทางปฏิบัติแนะนำในการแก้ไขปัญหาเหล่านี้

บริการการช่วยเหลือพิเศษจะดูแลจัดการเหตุการณ์ D-pad

สาเหตุของปัญหานี้คือการช่วยเหลือพิเศษใช้เหตุการณ์สําคัญ บริการต่างๆ

การใช้งานกิจกรรม Dpad รูปที่ 1 แผนภาพแสดงการทำงานของระบบเมื่อเปิดและปิด TalkBack

ดังที่แสดงในรูปที่ 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 เพื่อดูแนวทางปฏิบัติแนะนำสำหรับ เพิ่มการสนับสนุนการช่วยเหลือพิเศษลงในแอปที่ใช้มุมมองที่กำหนดเอง