Viele Android TV-Apps werden mit nativen Android-Komponenten erstellt. Es ist aber auch wichtig, die Barrierefreiheit von Frameworks oder Komponenten von Drittanbietern zu berücksichtigen, insbesondere bei der Verwendung benutzerdefinierter Ansichten.
Benutzerdefinierte Ansichtskomponenten, die direkt mit OpenGL oder Canvas interagieren, funktionieren möglicherweise nicht gut mit Bedienungshilfen wie TalkBack und Schalterzugriff.
Beachten Sie einige der folgenden Probleme, die bei aktiviertem TalkBack auftreten können:
- Der Fokus für Bedienungshilfen (ein grünes Rechteck) verschwindet möglicherweise in Ihrer App.
- Der Fokus für Bedienungshilfen wählt möglicherweise den Rand des gesamten Bildschirms aus.
- Der Fokus für Bedienungshilfen kann möglicherweise nicht verschoben werden.
- Die vier Richtungstasten auf dem Steuerkreuz haben möglicherweise keine Wirkung, auch wenn sie in Ihrem Code verarbeitet werden.
Wenn eines dieser Probleme in Ihrer App auftritt, prüfen Sie, ob Ihre App ihren
AccessibilityNodeInfo-Baum für die Bedienungshilfen verfügbar macht.
Im Rest dieses Leitfadens finden Sie einige Lösungen und Best Practices, um diese Probleme zu beheben.
Steuerkreuzereignisse werden von Bedienungshilfen verarbeitet
Die Ursache dieses Problems ist, dass Tastenereignisse von Bedienungshilfen verarbeitet werden.
Wie in Abbildung 1 dargestellt, werden Steuerkreuzereignisse bei aktiviertem TalkBack nicht an den vom Entwickler definierten Steuerkreuz-Handler übergeben. Stattdessen erhalten Bedienungshilfen die Tastenereignisse, damit sie den Fokus für Bedienungshilfen verschieben können. Da benutzerdefinierte Android-Komponenten standardmäßig keine Informationen zu ihrer Position auf dem Bildschirm an Bedienungshilfen weitergeben, können Bedienungshilfen den Fokus für Bedienungshilfen nicht verschieben, um sie hervorzuheben.
Andere Bedienungshilfen sind ähnlich betroffen: Steuerkreuzereignisse können auch bei der Verwendung von Schalterzugriff verarbeitet werden.
Da Steuerkreuzereignisse an Bedienungshilfen gesendet werden und diese nicht wissen, wo sich UI-Komponenten in einer benutzerdefinierten Ansicht befinden, müssen Sie AccessibilityNodeInfo für Ihre App implementieren, damit die Tastenereignisse korrekt weitergeleitet werden.
Informationen für Bedienungshilfen verfügbar machen
Damit Bedienungshilfen genügend Informationen zum Standort
und zur Beschreibung benutzerdefinierter Ansichten erhalten, implementieren Sie AccessibilityNodeInfo um
Details für jede Komponente verfügbar zu machen. Um die logische Beziehung von Ansichten
zu definieren, damit Bedienungshilfen den Fokus verwalten können, implementieren Sie
ExploreByTouchHelper und legen Sie ihn für benutzerdefinierte Ansichten mit
ViewCompat.setAccessibilityDelegate(View, AccessibilityDelegateCompat)
fest.
Überschreiben Sie beim Implementieren von ExploreByTouchHelper die vier abstrakten Methoden:
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)
Weitere Informationen finden Sie im Video Google I/O 2013 – Enabling Blind and Low-Vision Accessibility on Android oder im Artikel Bedienungshilfenereignisse ausfüllen.
Best Practices
Erforderlich:
AccessibilityNodeInfo.getBoundsInScreen()muss die Position der Komponente definieren.Erforderlich:
AccessibilityNodeInfo.setVisibleToUser()muss die Sichtbarkeit der Komponente widerspiegeln.Erforderlich:
AccessibilityNodeInfo.getContentDescription()muss die Inhaltsbeschreibung angeben, die von TalkBack angesagt werden soll.Geben Sie
AccessibilityNodeInfo.setClassName()an, damit Dienste den Komponententyp unterscheiden können.Spiegeln Sie bei der Implementierung von
performAction()die Aktion mit einem entsprechendenAccessibilityEventwider.Wenn Sie weitere Aktionstypen wie
ACTION_CLICKimplementieren möchten, rufen SieAccessibilityNodeInfo.addAction(ACTION_CLICK)mit der entsprechenden Logik inperformAction()auf.Spiegeln Sie gegebenenfalls den Komponentenstatus für
setFocusable(),setClickable(),setScrollable()und ähnliche Methoden wider.In der Dokumentation zu
AccessibilityNodeInfofinden Sie weitere Möglichkeiten, wie Bedienungshilfen besser mit Ihren Komponenten interagieren können.
Beispiel
Im Beispiel zur Barrierefreiheit benutzerdefinierter Ansichten für Android TV finden Sie Best Practices zum Hinzufügen von Unterstützung für Bedienungshilfen zu Apps mit benutzerdefinierten Ansichten.