Les applications TV ont parfois des cas d'utilisation qui compliquent TalkBack pour utiliser l'application. Afin d'améliorer l'expérience TalkBack pour ces les utilisateurs, consultez chacune des sections de ce guide et apportez les modifications nécessaires l'application si nécessaire. Si votre application utilise des vues personnalisées, vous devez également consulter la guide correspondant qui explique comment favoriser l'accessibilité avec des de vues.
Gérer les vues imbriquées
La navigation dans les vues imbriquées peut être difficile pour les utilisateurs de TalkBack. Dans la mesure du possible, assurez-vous la vue parent ou enfant pouvant être sélectionnée par TalkBack, mais pas les deux.
Pour que TalkBack puisse activer une vue, définissez les paramètres focusable
et
focusableInTouchMode
à true
. Cette étape est
nécessaire car
Certains téléviseurs peuvent passer en mode tactile ou le quitter lorsque TalkBack est actif.
Pour rendre une vue non sélectionnable, il suffit de définir focusable
à false
. Toutefois, si la vue est exploitable
l'élément AccessibilityNodeInfo
correspondant a ACTION_CLICK
), il peut quand même
être sélectionnables.
Modifier les descriptions des actions
Par défaut, TalkBack énonce "Appuyez sur Sélectionner pour activer" pour obtenir des vues exploitables. Pour certaines actions, le terme "activer" n'est peut-être pas une bonne description. À fournir une description plus précise, vous pouvez la modifier:
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); } });
Ajouter la prise en charge des curseurs
TalkBack sur téléviseur est compatible avec les curseurs. Pour activer le curseur, ajoutez
ACTION_SET_PROGRESS
à une vue avec un objet RangeInfo
.
L'utilisateur passe en mode curseur en appuyant sur le bouton central de la télécommande du téléviseur.
Dans ce mode, les boutons fléchés génèrent ACTION_SCROLL_FORWARD
et
Actions d'accessibilité ACTION_SCROLL_BACKWARD
L'exemple suivant implémente un curseur de volume avec des niveaux de 1 à 10:
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; } }