Bei TV-Apps gibt es manchmal Anwendungsfälle, die es Nutzern, die auf TalkBack angewiesen sind, erschweren, die App zu verwenden. Damit diese Nutzer TalkBack besser nutzen können, solltest du die einzelnen Abschnitte in diesem Leitfaden durchgehen und bei Bedarf Änderungen an deiner App vornehmen. Wenn deine App benutzerdefinierte Ansichten verwendet, solltest du auch den entsprechenden Leitfaden lesen, in dem beschrieben wird, wie du die Barrierefreiheit mit benutzerdefinierten Ansichten unterstützen kannst.
Verschachtelte Ansichten verarbeiten
Verschachtelte Ansichten können für TalkBack-Nutzer schwer zu navigieren sein. Mache nach Möglichkeit entweder die übergeordnete Ansicht oder die Kinderansicht für TalkBack fokussierbar, aber nicht beide.
Wenn du eine Ansicht für TalkBack fokussierbar machen möchtest, setze das focusable und das
focusableInTouchMode Attribut auf true. Dieser Schritt ist erforderlich, da einige TV-Geräte möglicherweise in den Touch-Modus wechseln und ihn wieder verlassen, während TalkBack aktiv ist.
Wenn du eine Ansicht nicht fokussierbar machen möchtest, reicht es aus, das focusable
Attribut auf false zu setzen. Wenn die Ansicht jedoch aktionsfähig ist (d. h., das
entsprechende AccessibilityNodeInfo hat ACTION_CLICK), ist sie möglicherweise weiterhin
fokussierbar.
Beschreibungen für Aktionen ändern
Standardmäßig gibt TalkBack für aktionsfähige Ansichten „Drücke zum Aktivieren auf „Auswählen““ aus. Bei einigen Aktionen ist der Begriff „Aktivieren“ möglicherweise keine gute Beschreibung. Du kannst die Beschreibung ändern, um sie genauer zu gestalten:
Kotlin
findViewById<View>(R.id.custom_actionable_view).accessibilityDelegate = object : View.AccessibilityDelegate() {
override fun onInitializeAccessibilityNodeInfo(host: View, info: AccessibilityNodeInfo) {
super.onInitializeAccessibilityNodeInfo(host, info)
info.addAction(
AccessibilityAction(
AccessibilityAction.ACTION_CLICK.id,
getString(R.string.custom_label)
)
)
}
}
Java
findViewById(R.id.custom_actionable_view).setAccessibilityDelegate(new AccessibilityDelegate() {
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(host, info);
AccessibilityAction action = new AccessibilityAction(
AccessibilityAction.ACTION_CLICK.getId(), getString(R.string.custom_label));
info.addAction(action);
}
});
Unterstützung für Schieberegler hinzufügen
TalkBack auf dem Fernseher bietet spezielle Unterstützung für Schieberegler. Wenn du den Schiebereglermodus aktivieren möchtest, füge einer Ansicht
ACTION_SET_PROGRESS zusammen mit einem RangeInfo-Objekt hinzu.
Der Nutzer wechselt in den Schiebereglermodus, indem er die mittlere Taste der TV-Fernbedienung drückt.
In diesem Modus generieren die Pfeiltasten die Barrierefreiheitsaktionen ACTION_SCROLL_FORWARD und
ACTION_SCROLL_BACKWARD.
Im folgenden Beispiel wird ein Lautstärkeregler mit Stufen von 1 bis 10 implementiert:
Kotlin
/**
* This example only provides slider functionality for TalkBack users. Additional logic should
* be added for other users. Such logic may reuse the increase and decrease methods.
*/
class VolumeSlider(context: Context?, attrs: AttributeSet?) : LinearLayout(context, attrs) {
private val min = 1
private val max = 10
private var current = 5
private var textView: TextView? = null
init {
isFocusable = true
isFocusableInTouchMode = true
val rangeInfo =
AccessibilityNodeInfo.RangeInfo(
AccessibilityNodeInfo.RangeInfo.RANGE_TYPE_INT,
min.toFloat(),
max.toFloat(),
current.toFloat()
)
accessibilityDelegate =
object : AccessibilityDelegate() {
override fun onInitializeAccessibilityNodeInfo(host: View, info: AccessibilityNodeInfo) {
super.onInitializeAccessibilityNodeInfo(host, info)
info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SET_PROGRESS)
info.rangeInfo = rangeInfo
}
override fun performAccessibilityAction(host: View, action: Int, args: Bundle?): Boolean {
if (action == AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD.id) {
increase()
return true
}
if (action == AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_BACKWARD.id) {
decrease()
return true
}
return super.performAccessibilityAction(host, action, args)
}
}
}
override fun onFinishInflate() {
super.onFinishInflate()
textView = findViewById(R.id.text)
textView!!.text = context.getString(R.string.level, current)
}
private fun increase() {
update((current + 1).coerceAtMost(max))
}
private fun decrease() {
update((current - 1).coerceAtLeast(min))
}
private fun update(newLevel: Int) {
if (textView == null) {
return
}
val newText = context.getString(R.string.level, newLevel)
// Update the user interface with the new volume.
textView!!.text = newText
// Announce the new volume.
announceForAccessibility(newText)
current = newLevel
}
}
Java
/**
* This example only provides slider functionality for TalkBack users. Additional logic should
* be added for other users. Such logic can reuse the increase and decrease methods.
*/
public class VolumeSlider extends LinearLayout {
private final int min = 1;
private final int max = 10;
private int current = 5;
private TextView textView;
public VolumeSlider(Context context, AttributeSet attrs) {
super(context, attrs);
setFocusable(true);
setFocusableInTouchMode(true);
RangeInfo rangeInfo = new RangeInfo(RangeInfo.RANGE_TYPE_INT, min, max, current);
setAccessibilityDelegate(
new AccessibilityDelegate() {
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(host, info);
info.addAction(AccessibilityAction.ACTION_SET_PROGRESS);
info.setRangeInfo(rangeInfo);
}
@Override
public boolean performAccessibilityAction(View host, int action, Bundle args) {
if (action == AccessibilityAction.ACTION_SCROLL_FORWARD.getId()) {
increase();
return true;
}
if (action == AccessibilityAction.ACTION_SCROLL_BACKWARD.getId()) {
decrease();
return true;
}
return super.performAccessibilityAction(host, action, args);
}
});
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
textView = findViewById(R.id.text);
textView.setText(getContext().getString(R.string.level, current));
}
private void increase() {
update(Math.min(current + 1, max));
}
private void decrease() {
update(Math.max(current - 1, min));
}
private void update(int newLevel) {
if (textView == null) {
return;
}
String newText = getContext().getString(R.string.level, newLevel);
// Update the user interface with the new volume.
textView.setText(newText);
// Announce the new volume.
announceForAccessibility(newText);
current = newLevel;
}
}