Unterstützung von Bedienungshilfen für die benutzerdefinierte Ansicht auf Android TV

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.

D-Pad-Ereignisse und TalkBack
Abbildung 1. Diagramme, die zeigen, wie das System mit aktiviertem und deaktiviertem TalkBack funktioniert.

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

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.