web-dev-qa-db-fra.com

Comment changer les instructions de conversation Android pour un double tap et un appui long

J'ai une vue qui a un long gestionnaire d'action de presse. J'utilise la description du contenu pour définir le message Talkback parle lorsque la vue devient active.

Actuellement, ma description de contenu est indiquée juste après avoir obtenu le focus, et après une courte pause, elle indique:

Taper deux fois pour activer, taper deux fois et maintenir pour une pression longue

Je veux changer ce message en quelque chose comme

Appuyez deux fois sur "action 1" , maintenez deux fois le doigt appuyé sur "action 2"

Y a-t-il un moyen de le faire?

J'ai regardé dans onPopulateAccessibilityEvent(), l'événement TYPE_VIEW_ACCESSIBILITY_FOCUSED apparaît, mais je n'ai pas pu modifier le message souhaité. 

Est-ce que je manque quelque chose de simple?

7
Paul

Il semble que AccessibilityAction ait légèrement changé depuis alanv posté sa réponse. Voici une solution de travail utilisant ViewCompat:

ViewCompat.setAccessibilityDelegate(view, new AccessibilityDelegateCompat() {
    @Override
    public void onInitializeAccessibilityNodeInfo(View Host, AccessibilityNodeInfoCompat info) {
        super.onInitializeAccessibilityNodeInfo(Host, info);
        // A custom action description. For example, you could use "pause"
        // to have TalkBack speak "double-tap to pause."
        CharSequence description = Host.getResources().getText(R.string.my_click_desc);
        AccessibilityActionCompat customClick = new AccessibilityActionCompat(
                    AccessibilityNodeInfoCompat.ACTION_CLICK, description);
        info.addAction(customClick);
    }
});
5
JustinMorris

Dans API 21+, vous pouvez personnaliser les noms d'action en définissant des actions personnalisées dans la variable AccessibilityNodeInfo de votre vue. Il existe deux approches pour cela: 1) définir une AccessibilityDelegate et remplacer la méthode déléguée onInitializeAccessibilityNodeInfo ou 2) étendre la classe de la vue et remplacer la onInitializeAccessibilityNodeInfo.

Dans les deux cas, vous allez créer un nouveau AccessibilityAction et le définir sur le noeud à l’aide de AccessibilityNodeInfo.addAction .

Si vous choisissez d'utiliser un délégué, vous définissez une description personnalisée pour l'action de clic comme suit:

view.setAccessibilityDelegate(new AccessibilityDelegate() {
  @Override
  public void onInitializeAccessibilityNodeInfo(
      View v, AccessibilityNodeInfo info) {
    super.onInitializeAccessibilityNodeInfo(v, info);

    // A custom action description. For example, you could use "pause"
    // to have TalkBack speak "double-tap to pause."
    CharSequence description = getResources().getText(R.string.my_click_desc);
    AccessibilityAction customClick = new AccessibilityAction(
            AccessibilityAction.ACTION_ACTION_CLICK, description);
    info.addAction(customClick);
  }
});

Si votre application cible API <21, substituez les méthodes de bibliothèque de support *Compat appropriées. La fonctionnalité n'est pas rétroportée. Par conséquent, vous n'obtiendrez pas de descriptions personnalisées sur l'API <21, mais vous pourrez éviter les vérifications de version explicites dans votre code d'application.

8
alanv

Utilisez le code ci-dessous pour ceux qui veulent supprimer la phrase complète, par exemple. "double tap to".

ViewCompat.setAccessibilityDelegate(view, new AccessibilityDelegateCompat() {
        @Override
        public void onInitializeAccessibilityNodeInfo(View Host, AccessibilityNodeInfoCompat info) {
            super.onInitializeAccessibilityNodeInfo(Host, info);
            info.addAction(AccessibilityNodeInfoCompat.ACTION_FOCUS);
        }
});

Ceci appelle essentiellement le code ci-dessous et requestFocus ne possède aucune annonce de conversation par défaut.

case AccessibilityNodeInfo.ACTION_FOCUS: {
                if (!hasFocus()) {
                    // Get out of touch mode since accessibility
                    // wants to move focus around.
                    getViewRootImpl().ensureTouchMode(false);
                    return requestFocus();
                }
            }
1
Rubin Yoo

Utilisez le code ci-dessous pour ceux qui veulent supprimer la phrase complète, par exemple. "double tap pour activer", "double tap et maintenir pour un appui long".

mSubTitleText = (TextView) view.findViewById(R.id.txt_subtitle);

 ViewCompat.setAccessibilityDelegate(mSubTitleText, new AccessibilityDelegateCompat() {
            @Override
            public void onPopulateAccessibilityEvent(View Host, AccessibilityEvent event) {
                Host.setClickable(false);
                Host.setLongClickable(false);
            }
        });
0
Azeela