web-dev-qa-db-fra.com

Android - Définir le focus d'accessibilité TalkBack sur une vue spécifique

Lorsque TalkBack est activé, existe-t-il un moyen de définir le manuel de mise au point d'accessibilité sur une vue spécifique? Par exemple, lorsque mon activité est lancée, je veux que TalkBack se concentre automatiquement sur un certain bouton (cadre jaune autour de la vue) et lit sa description de contenu.

Ce que j'ai essayé jusqu'à présent:

    myButton.setFocusable(true);
    myButton.setFocusableInTouchMode(true);
    myButton.requestFocus();

il semble que requestFocus () ne demande que le focus d'entrée et n'a rien à voir avec le focus d'accessibilité. J'ai aussi essayé:

    myButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
    myButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
    myButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED);
    myButton.announceForAccessibility("accessibility test");
    myButton.performAccessibilityAction(64, null); // Equivalent to ACTION_ACCESSIBILITY_FOCUS

    AccessibilityManager manager = (AccessibilityManager) getSystemService(Context.ACCESSIBILITY_SERVICE);
    if (manager.isEnabled()) {
        AccessibilityEvent e = AccessibilityEvent.obtain();
        e.setSource(myButton);
        e.setEventType(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
        e.setClassName(getClass().getName());
        e.setPackageName(getPackageName());
        e.getText().add("another accessibility test");
        manager.sendAccessibilityEvent(e);
    }

Rien de tout cela ne semble fonctionner.

20
Skywalker10

AVERTISSEMENT: Forcer la concentration sur la charge d'activité à être n'importe où mais dans la barre supérieure est toujours (d'accord, ne devrait presque jamais être dit), mais vraiment, ne le faites pas. C'est une violation de toutes sortes de réglementations WCAG 2.0, y compris 3.2.1 et 3.2.3, concernant respectivement la navigation prévisible et les changements de contexte. En faisant cela, vous rendez probablement votre application PLUS inaccessible.

http://www.w3.org/TR/WCAG20/#consistent-behavior

CLAUSE DE NON-RESPONSABILITÉ.

Vous utilisez les appels de fonction appropriés. Tout ce que vous devez faire est le suivant:

myButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);

Le problème est probablement le moment où vous essayez de le faire. Talkback s'attache à votre activité un peu plus tard dans le cycle d'activité. La solution suivante illustre ce problème, je ne suis pas sûr qu'il existe une meilleure façon de le faire, pour être honnête. J'ai essayé onPostResume, qui est le dernier rappel des appels du système d'exploitation Android, concernant le chargement des activités, et j'ai quand même dû ajouter un délai.

@Override
protected void onPostResume() {
    super.onPostResume();

    Log.wtf(this.getClass().getSimpleName(), "onPostResume");

    Runnable task = new Runnable() {

        @Override
        public void run() {
            Button theButton = (Button)WelcomeScreen.this.findViewById(R.id.idButton);
            theButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
        }
    };

    final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor();

    worker.schedule(task, 5, TimeUnit.SECONDS);

}

Vous pourrez peut-être créer une vue personnalisée. Les rappels en vue peuvent fournir la logique dont vous avez besoin pour le faire, sans condition de concurrence! Je pourrais approfondir la question plus tard si j'en ai le temps.

33
ChrisCM