puedo - Android: establezca el enfoque de accesibilidad de TalkBack en una vista específica
talkback huawei (1)
Cuando TalkBack está habilitado, ¿hay alguna manera de configurar el manual de enfoque de accesibilidad para una vista específica? Por ejemplo, cuando se inicia mi actividad, quiero que TalkBack se enfoque automáticamente en un determinado botón (marco amarillo alrededor de la vista) y lea la descripción del 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.
DESCARGO DE RESPONSABILIDAD: forzar el enfoque en la carga de la actividad para estar en cualquier lugar, pero en la barra superior siempre está (bueno, casi nunca debería decirse), pero en realidad, simplemente no lo haga. Es una violación de todo tipo de regulaciones WCAG 2.0, incluyendo 3.2.1 y 3.2.3, con respecto a la navegación predecible y los cambios de contexto, respectivamente. Es probable que tu aplicación sea MÁS inaccesible haciendo esto.
http://www.w3.org/TR/WCAG20/#consistent-behavior
DESCARGO DE RESPONSABILIDAD.
Está utilizando las llamadas de función correcta. Todo lo que necesitas hacer es esto:
myButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
El problema es más probable en el punto en el que está intentando hacer esto. Talkback se adjunta 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. Probé onPostResume, que es la última devolución de llamada que realiza el sistema operativo Android, en relación con la carga de actividades, y aún así tuve que agregar una demora.
@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 verlo más tarde si tengo tiempo.