Android: Come forzare Esplora-By-Touch / Talkback per ripetere il ContentDescription della vista corrente in AccessibilityFocus?

Nella mia applicazione Android, ho una View che visualizza un'image e dispone di una ContentDescription associata.

Posso abilitare Impostazioni-> Accessibilità-> Talkback , con Esplora da touch nelle impostazioni di Talkback e poi toccare un singolo ContentDescription nella vista per leggere la voce ContentDescription ad alta voce.

  • Android Google Maps v2: come aggiungere l'indicatore con lo snippet multilinea?
  • Equivalente di ListView.setEmptyView in RecyclerView
  • android Non è consentito caricare la risorsa locale: file: /// android_asset
  • Il conflitto di SDK di Twitter di Android Twitter è compatibile con la libreria di supporto
  • Come get il tempo corrente da internet in android
  • Come get il risultato di OnPostExecute () per l'attività principale perché AsyncTask è una class separata?
  • Questo è tutto ciò che ci si aspettava finora.

    Tuttavia, vorrei che Esplora da toccare per ripetere la ContentDescription se singolo toccare di nuovo la stessa View . Ad esempio, la mia image e descrizione potrebbero essere aggiornate mentre ha l' AccessibilityFocus , quindi dicendo che la nuova frase sarebbe utile per l'utente. Come posso raggiungere questo objective?

    Ho provato a sperimentare View.clearFocus() e View.invalidate() , ma senza successo.

    Qualsiasi idea costruttiva sarebbe benvenuta.

    Aggiornare

    Avrei anche detto che voglio aggiungere supporto da API 8 in poi. Quindi, cerco di fare il meglio che posso con l'interface di Accessibility da API 4.

    Attualmente sto lavorando su una soluzione che utilizza View.clearFocus() seguito da View.requestFocus() per aggirare il problema di visualizzazione aggiornato. Questo sembra funzionare finora sul mio kit di prova con le API 8 e 16.

    Riprenderò nuovamente con il risultato finale, ma accolgo ulteriori suggerimenti nell'intervallo.

  • Come posso utilizzare AccessibilityService.getWindows () per get un AccessibilityNodeInfo traversabile?
  • Android: Come eliminare il text parlato da AccessibilityEvents quando si estende SeekBar?
  • Come posso mantenere un gesto di un puntatore quando è triggersto l'esplorazione per contatto?
  • Come leggere il contenuto della window (utilizzando accessibilityService) e evocare l'interface utente utilizzando il disegno su un'altra authorization di applicazioni in Android?
  • AccessibilityService è stato avviato ma non riceve AccessibilityEvents su JellyBean
  • Come fare clic sul button nelle impostazioni utilizzando AccessibilityService?
  • One Solution collect form web for “Android: Come forzare Esplora-By-Touch / Talkback per ripetere il ContentDescription della vista corrente in AccessibilityFocus?”

    Come promesso nella mia domanda, ecco i risultati della mia indagine e una soluzione di lavoro.

    Innanzitutto, grazie a alanv per il suo aiuto e supporto, e per rispondere alla domanda per le API successive (14 e più). Anche se non ha trovato la soluzione per API più vecchie, ha fornito informazioni critiche che mi hanno aiutato a trovare una risposta.

    Al momento della scrittura, non è ansible build un AccessibilityEvent con successo, a causa di un bug noto in TalkBack – vedere Invia evento di accessibilità non collegato alla vista per ulteriori dettagli. Se l'origine dell'evento è nullo, l'evento viene ignorato da TalkBack (v3.5.0_r105) e come AccessibilityEvent.setSource(View) apparso per la prima volta nell'API 14 , non è ansible impostare la sorgente prima di ciò – vedere Google Eyes-Free emettere # 379

    Tuttavia, è ansible fare Android generare tali events utilizzando View.requestFocus() come ho precedentemente suggerito.

    1. Rendere la tua vista focalizzabile nel layout XML utilizzando:

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

    2. Impostare il text parlato usando View.setContentDescription(text) in Activity.onCreate o con android:contentDescription="text" nel layout XML se è statico o in modo dinamico nel codice se necessario.

    3. Quando è richiesto il text parlato, spostare la messa a fuoco nella visualizzazione corretta utilizzando View.requestFocus() per triggersre un AccessibilityEvent .

    4. Per assicurare che una frase si ripeta (la mia domanda originale), call View.clearFocus() prima di richiedere la messa a fuoco nel passaggio precedente.

    Ho un'applicazione testata di questo approccio che funziona con API 8 e funziona anche con API 16. Dovrebbe funzionare tutto il return all'API 4, quando è stata prima introdotta l' API di Accessibilità .

    Questa soluzione potrebbe non essere necessaria per gli sviluppatori che supportno solo API Android più recenti (14 e versioni successive), ma ritengo che ci siano poche altre opzioni attualmente supportte da Accessibility nelle API precedenti. In bocca al lupo.

    Aggiornare

    Purtroppo, la risposta di alanv sembra essere scomparsa – forse cancellata – prendendo con sé tutti i dettagli e la discussione associati nei commenti. Ho cercato di recuperare i punti principali qui sotto.

    1. Per Android API 14 e versioni successive, è ansible creare events mirati come segue:

      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. Per Android API 16 e View.announceForAccessibility(text) successive, è ansible utilizzare View.announceForAccessibility(text) .

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.