it-swarm.dev

Android - Establezca el enfoque de accesibilidad de TalkBack en una vista específica

Cuando TalkBack está habilitado, ¿hay alguna forma de configurar el manual de enfoque de accesibilidad en una vista específica? Por ejemplo, cuando se inicia mi actividad, quiero que TalkBack se enfoque automáticamente en un botón determinado (marco amarillo alrededor de la vista) y lea su descripción de contenido.

Lo que he probado hasta ahora:

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

requestFocus (), al parecer, solo solicita un enfoque de entrada y no tiene nada que ver con el enfoque de accesibilidad. También he intentado:

    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);
    }

Nada de esto parece funcionar.

20
Skywalker10

DESCARGO DE RESPONSABILIDAD: Forzar el foco en la carga de la Actividad para que esté en cualquier lugar, pero en la barra superior es siempre (está bien, casi nunca debería decirse), pero realmente, simplemente no lo hagas. Es una violación de todo tipo de regulaciones WCAG 2.0, incluidas 3.2.1 y 3.2.3, con respecto a la navegación predecible y los cambios de contexto, respectivamente. Probablemente, de hecho, haga que su aplicación sea MÁS inaccesible al hacer esto.

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

EXENCIÓN DE RESPONSABILIDAD.

Está utilizando las llamadas de función correctas. Todo lo que debes hacer es esto:

myButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);

Es más probable que el problema sea el punto en el que intentas hacer esto. Talkback se adhiere a su actividad un poco más tarde en el ciclo de actividad. La siguiente solución ilustra este problema, no estoy seguro de que haya una mejor manera de hacerlo, para ser honesto. Intenté en PostResume, que es la última devolución de llamada de Android llamadas del sistema operativo, con respecto a la carga de actividades, y aún así tuve que agregar un retraso.

@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);

}

Es posible que pueda crear una vista personalizada. ¡Las devoluciones de llamada a la vista pueden proporcionar la lógica que necesita para hacer esto, sin la condición de carrera! Podría investigarlo más tarde si tengo tiempo.

33
ChrisCM