雖然許多 Android TV 應用程式都內建 Android 元件, 也要考量 架構或元件,尤其是使用自訂檢視時。
與 OpenGL 或 Canvas 直接互動的自訂檢視畫面元件可能無法正常運作 以及 TalkBack 和切換控制功能等無障礙服務
請思考切換 TalkBack 時可能發生的問題,如下所示 已開啟:
- 應用程式中的無障礙功能焦點 (綠色矩形) 可能會消失。
- 無障礙焦點可能會選取整個螢幕的邊界。
- 你可能無法移動無障礙焦點。
- D-pad 的四個方向鍵可能不會產生任何作用,即使程式碼會處理這些按鍵也一樣。
在應用程式中發現這些問題時,請確認
應用程式會公開其 AccessibilityNodeInfo
存取無障礙服務樹狀結構
本指南的其餘部分提供瞭解決這些問題的解決方案和最佳做法。
無障礙服務會使用 D-pad 事件
這個問題的根本原因在於,無障礙功能會消耗重要事件 免費 Google Cloud 服務
如圖 1 所示,當 TalkBack 開啟時,D-Pad 事件會觸發 D-Pad 事件 不會傳遞至開發人員定義的 D-Pad 處理常式。 無障礙服務會接收按鍵事件,因此能夠 無障礙中心的重點由於自訂 Android 元件並不會預設公開發布 無障礙服務針對自己在畫面上的位置取得相關資訊。 無障礙服務無法移動無障礙功能的焦點來醒目顯示該元素。
其他無障礙服務也很類似:D-Pad 事件也可能 。
因為 D-pad 事件會提交至無障礙服務
服務不知道 UI 元件在自訂檢視畫面中的位置
您必須為應用程式實作 AccessibilityNodeInfo
,才能傳送
正確設定重要事件
向無障礙服務公開資訊
為無障礙服務提供
自訂檢視區塊的位置和說明,請導入 AccessibilityNodeInfo
顯示每個元件的詳細資料
定義 View 的邏輯關係,讓無障礙服務可以
管理焦點,導入 ExploreByTouchHelper
並使用
ViewCompat.setAccessibilityDelegate(View, AccessibilityDelegateCompat)
以及自訂檢視畫面
實作 ExploreByTouchHelper
時,請覆寫其四個抽象方法:
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)
如需瞭解詳情,請觀看 2013 年 Google I/O 大會 - 啟用失明和低視能 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 的自訂檢視畫面無障礙功能範例,瞭解最佳做法 為使用自訂檢視畫面的應用程式新增無障礙功能支援。