Bien que de nombreuses applications Android TV soient créées avec des composants Android natifs, il est également important de tenir compte de l'accessibilité ou composants, en particulier lorsque vous utilisez des vues personnalisées.
Les composants de vue personnalisée interagissant directement avec OpenGL ou Canvas risquent de ne pas fonctionner correctement. avec des services d'accessibilité comme TalkBack et Switch Access.
Voici quelques-uns des problèmes qui peuvent survenir lorsque TalkBack est activé. sur:
- Le ciblage de l'accessibilité (un rectangle vert) peut disparaître de votre application.
- Le ciblage de l'accessibilité peut sélectionner les limites de l'intégralité de l'écran.
- Il est possible que le curseur de l'accessibilité ne puisse pas être déplacé.
- Il est possible que les quatre touches de direction du pavé directionnel n'aient aucun effet, même si votre code les gère.
Si vous constatez l'un de ces problèmes dans votre application, vérifiez que votre
application expose ses AccessibilityNodeInfo
aux services d'accessibilité.
Le reste de ce guide propose des solutions et des bonnes pratiques pour résoudre ces problèmes.
Les événements du pavé directionnel sont utilisés par les services d'accessibilité
La cause première de ce problème est que les événements clés sont consommés par l'accessibilité services.
Comme illustré dans la figure 1, lorsque TalkBack est activé, les événements du pavé directionnel ne sont pas transmises au gestionnaire du pavé directionnel défini par le développeur. À la place, reçoivent les événements clés pour pouvoir déplacer le ciblage de l'accessibilité. Étant donné que les composants Android personnalisés n'exposent pas des informations aux services d'accessibilité concernant leur position à l'écran, les services d'accessibilité ne peuvent pas déplacer le curseur sur l'accessibilité pour les mettre en surbrillance.
Les autres services d'accessibilité sont affectés de la même manière: les événements du pavé directionnel peuvent également être consommées lors de l'utilisation de Switch Access.
Les événements du pavé directionnel sont envoyés aux services d'accessibilité.
ce service ne sait pas où se trouvent
les composants d'UI dans une vue personnalisée,
vous devez implémenter AccessibilityNodeInfo
pour que votre application transfère le
les événements clés correctement.
Exposer des informations aux services d'accessibilité
Pour fournir aux services d'accessibilité suffisamment d'informations sur
Emplacement et description des vues personnalisées, implémentez AccessibilityNodeInfo
.
pour présenter les détails de chaque composant.
Définir la relation logique entre les vues afin que les services d'accessibilité puissent
gérer la sélection, implémenter ExploreByTouchHelper
et le configurer à l'aide de
ViewCompat.setAccessibilityDelegate(View, AccessibilityDelegateCompat)
pour les vues personnalisées.
Lorsque vous implémentez ExploreByTouchHelper
, remplacez ses quatre méthodes abstraites:
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)
Pour en savoir plus, visionnez la vidéo Google I/O 2013 - Using Blind and Low-Vision Accessibilité sur Android ou découvrez comment renseigner les événements d'accessibilité.
Bonnes pratiques
Obligatoire:
AccessibilityNodeInfo.getBoundsInScreen()
doit définir la position du composant.Obligatoire:
AccessibilityNodeInfo.setVisibleToUser()
doit refléter la visibilité du composant.Obligatoire:
AccessibilityNodeInfo.getContentDescription()
doit spécifier la description du contenu que TalkBack doit annoncer.Spécifier
AccessibilityNodeInfo.setClassName()
afin que les services puissent différencier le type de composant.Lorsque vous implémentez
performAction()
, refléter l'action à l'aide d'unAccessibilityEvent
correspondant ;Pour implémenter d'autres types d'actions, tels que
ACTION_CLICK
, appelezAccessibilityNodeInfo.addAction(ACTION_CLICK)
à l'aide de la logique correspondante dansperformAction()
.Le cas échéant, reflétant l'état du composant pour
setFocusable()
,setClickable()
setScrollable()
et des méthodes similaires.Consulter la documentation pour
AccessibilityNodeInfo
pour identifier d'autres moyens d'interagir avec les services d'accessibilité vos composants.
Exemples
Consultez l'exemple d'accessibilité pour les vues personnalisées pour Android TV afin de connaître les bonnes pratiques pour l'ajout de fonctionnalités d'accessibilité aux applications utilisant des vues personnalisées.