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

Obwohl viele Android TV-Apps mit nativen Android-Komponenten erstellt werden, ist es auch wichtig, die Zugänglichkeit von Frameworks oder Komponenten von Drittanbietern zu berücksichtigen, insbesondere bei der Verwendung von benutzerdefinierten Ansichten.

Benutzerdefinierte Ansichtskomponenten, die direkt mit OpenGL oder Canvas verbunden sind, 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 Bedienungshilfenfokus (ein grünes Rechteck) wird in Ihrer App möglicherweise nicht mehr angezeigt.
  • Der Fokus für Bedienungshilfen kann den Rand des gesamten Bildschirms auswählen.
  • Der Fokus für die Barrierefreiheit ist möglicherweise nicht verschoben.
  • Die vier Richtungstasten auf dem Steuerkreuz haben möglicherweise keine Auswirkungen, auch wenn Ihr Code sie verarbeitet.

Wenn bei Ihrer App eines dieser Probleme auftritt, prüfen Sie, ob die App die AccessibilityNodeInfo-Baumstruktur für die Bedienungshilfen verfügbar macht.

Im weiteren Verlauf dieses Leitfadens finden Sie einige Lösungen und Best Practices zur Lösung dieser Probleme.

Steuerkreuz-Ereignisse werden von Bedienungshilfen genutzt

Die Ursache dieses Problems ist, dass Schlüsselereignisse von Bedienungshilfen verarbeitet werden.

Verbrauch von Steuerkreuz-Ereignissen Abbildung 1: Diagramme, die zeigen, wie das System bei aktiviertem und deaktiviertem TalkBack funktioniert.

Wie in Abbildung 1 dargestellt, werden die Steuerkreuzereignisse nicht an den vom Entwickler definierten Steuerkreuz-Handler weitergeleitet, wenn TalkBack eingeschaltet ist. Stattdessen erhalten die Bedienungshilfen die Schlüsselereignisse, damit sie den Fokus auf die Barrierefreiheit verschieben können. Da benutzerdefinierte Android-Komponenten Bedienungshilfen standardmäßig keine Informationen zu ihrer Position auf dem Bildschirm zur Verfügung stellen, können Bedienungshilfen den Fokus der Bedienungshilfen nicht verschieben, um sie hervorzuheben.

Andere Bedienungshilfen sind ähnlich betroffen: Bei Verwendung des Schalterzugriffs können auch Steuerkreuz-Ereignisse genutzt werden.

Da Steuerkreuz-Ereignisse an Bedienungshilfen gesendet werden und dieser Dienst nicht weiß, wo sich die UI-Komponenten in einer benutzerdefinierten Ansicht befinden, müssen Sie AccessibilityNodeInfo implementieren, damit Ihre App die Schlüsselereignisse korrekt weiterleitet.

Informationen für Bedienungshilfen bereitstellen

Damit für Bedienungshilfen genügend Informationen zum Standort und zur Beschreibung benutzerdefinierter Ansichten verfügbar sind, implementieren Sie AccessibilityNodeInfo, um Details zu jeder Komponente verfügbar zu machen. Um die logische Beziehung zwischen Ansichten zu definieren, damit Bedienungshilfen den Fokus verwalten können, implementieren Sie ExploreByTouchHelper und legen diesen Wert mit ViewCompat.setAccessibilityDelegate(View, AccessibilityDelegateCompat) für benutzerdefinierte Ansichten fest.

Überschreiben Sie bei der Implementierung 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 – Barrierefreiheit für Blinde und Sehbehinderte auf Android-Geräten oder zum Ausfüllen von Ereignissen zur Barrierefreiheit.

Best Practices

Beispiel

Im Beispiel zu Bedienungshilfen für benutzerdefinierte Ansichten für Android TV finden Sie Best Practices für das Hinzufügen von Bedienungshilfen zu Apps mit benutzerdefinierten Ansichten.