Android: ¿Cómo forzar Explore-By-Touch / Talkback para repetir la ContentDescription de la vista actual en AccessibilityFocus?

En mi aplicación para Android, tengo una View que muestra una imagen y tiene una ContentDescription asociada.

Puedo activar Ajustes-> Accesibilidad-> Talkback , con Explorar por Toque en la configuración de Talkback, y luego toque una sola vez en la Vista para leer la ContentDescription voz alta.

Esto es todo según lo esperado hasta ahora.

Sin embargo, me gustaría Explorar por Toque para repetir el ContentDescription si solo toque el mismo View nuevo. Por ejemplo, mi imagen y descripción se puede actualizar mientras tiene el AccessibilityFocus , por lo que decir la nueva frase sería útil para el usuario. ¿Cómo puedo conseguir esto?

He intentado experimentar con View.clearFocus() y View.invalidate() , pero sin éxito.

Cualquier idea constructiva sería bienvenida.

Actualizar

También debería haber mencionado que quiero añadir soporte de API 8 en adelante. Por lo tanto, estoy tratando de hacer lo mejor que puedo con la interfaz de accesibilidad de API 4.

Actualmente estoy trabajando en una solución que utiliza View.clearFocus() seguida de View.requestFocus() para View.requestFocus() el problema de actualización de vista. Esto parece funcionar hasta ahora en mi kit de prueba con APIs 8 y 16.

Actualizaré de nuevo con el resultado final, pero acojo más sugerencias en el ínterin.

Como se prometió en mi pregunta, aquí están los resultados de mi investigación y una solución de trabajo.

En primer lugar, muchas gracias a alanv por su ayuda y apoyo, y por responder a la pregunta para APIs posteriores (14 y más). Aunque no encontró la solución para las API más antiguas, proporcionó información crítica que me ayudó a encontrar una respuesta.

Al momento de escribir este documento, no es posible construir un AccessibilityEvent éxito, debido a un error conocido en TalkBack. Consulte el evento de accesibilidad de envío no vinculado a la vista para obtener más detalles. Si el origen del evento es nulo, el evento es ignorado por TalkBack (v3.5.0_r105) y como AccessibilityEvent.setSource(View) apareció por primera vez en API 14 , no es posible establecer el origen antes de eso. Número 379

Sin embargo, es posible hacer que Android genere dichos eventos utilizando View.requestFocus() como ya he sugerido.

  1. Haga que su vista se pueda enfocar en su diseño XML utilizando:

    android:focusable="true"
    android:focusableInTouchMode="true"

  2. Establezca el texto hablado utilizando View.setContentDescription(text) en Activity.onCreate o con android:contentDescription="text" en el diseño XML si es estático o dinámicamente en código si es necesario.

  3. Cuando se requiere el texto hablado, mueva el enfoque a la vista correcta usando View.requestFocus() para activar un AccessibilityEvent .

  4. Para asegurarse de que se repita una frase (mi pregunta original), llame a View.clearFocus() antes de solicitar el enfoque en el paso anterior.

Tengo una implementación probada de este enfoque trabajando en la API 8, y también funciona en la API 16. Debe funcionar todo el camino de vuelta a la API 4, cuando se introdujo la API de accesibilidad .

Es posible que esta solución no sea necesaria para desarrolladores que sólo admitan APIs Android más recientes (14 y posteriores), pero creo que hay algunas otras opciones disponibles actualmente para aquellos que admiten la accesibilidad en API anteriores. Buena suerte.

Actualizar

Desafortunadamente, la respuesta de alanv parece haber desaparecido – posiblemente eliminado – teniendo con él todos los detalles asociados y la discusión en los comentarios. He intentado recapturar los puntos principales abajo.

  1. Para Android API 14 y versiones posteriores, es posible crear eventos enfocados de la siguiente manera:

    if (mAccessibilityService.isEnabled()) { AccessibilityEvent event = AccessibilityEvent.obtain( AccessibilityEvent.TYPE_VIEW_FOCUSED); event.setSource(myView); // API 14 & later event.setClassName(myView.getClass().getName()); event.setPackageName(myView.getContext().getPackageName()); event.setEnabled(true); event.setContentDescription(text); myView.sendAccessibilityEventUnchecked(event); }

  2. Para Android API 16 y View.announceForAccessibility(text) posteriores, se puede utilizar View.announceForAccessibility(text) .

  • Cómo agregar contenidoDescrito a InfoWindow o marcador en Android GoogleMaps V2 para TalkBack
  • Android: evita que TalkBack anuncie el título de TextView en voz alta
  • Android: evita que TalkBack anuncie el título de TextView en voz alta
  • Cómo cambiar Android Talkback en caso de nombre de la aplicación
  • Configuración de la descripción del contenido del menú de opciones android Talkback
  • ¿Por qué nextFocusDown no funciona con la navegación de TalkBack?
  • Función de conversación de RecyclerView no bien
  • Android: establece el enfoque de accesibilidad de TalkBack a una vista específica
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.