多くの Android TV アプリはネイティブの Android コンポーネントで構築されていますが、 サードパーティ アプリがアクセスしやすく、 フレームワークやコンポーネントで、特にカスタムビューを使用する場合は特に重要になります。
OpenGL または Canvas と直接やり取りするカスタムビュー コンポーネントが適切に機能しない可能性がある TalkBack やスイッチ アクセスなどのユーザー補助サービスも提供しています。
TalkBack への切り替え時に発生する可能性のある、以下の問題を検討します。 日付:
- アプリでユーザー補助のフォーカス(緑色の長方形)が消えることがあります。
- ユーザー補助フォーカスで画面全体の境界が選択されることがあります。
- ユーザー補助のフォーカスは移動できない場合があります。
- D-pad の 4 つの方向キーは、コードで処理されていても効果がない場合があります。
アプリで次のいずれかの問題が発生した場合は、
アプリが 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 - Potential Blind and Low-Vision をご覧ください。 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 用のカスタムビューのユーザー補助サンプルをご覧ください。 カスタムビューを使用してアプリにユーザー補助サポートを追加する。