2012-11-03 22 views
7

Ho una schermata di sblocco in cui all'utente viene richiesto di inserire un pin di quattro cifre. Se l'utente immette il proprio pin in modo errato, viene visualizzato un messaggio TextView precedentemente invisibile con un messaggio di errore. A questo punto sarebbe utile che TalkBack leggesse ad alta voce il contenuto del messaggio di errore.Quando si utilizza TalkBack, qual è il modo preferito per avvisare l'utente quando il contenuto di un TextView è cambiato?

Attraverso alcuni esperimenti, mi sono reso conto che potevo impostare android:focusableInTouchMode="true" sulla vista e chiamare programmaticamente View#requestFocus(). Funziona per la prima volta, ma non riesce a errori successivi poiché la vista ha già lo stato attivo. Inoltre, in generale, sembra una cattiva idea ignorare l'attuale focus della vista.

Ho quindi provato a richiamare View#announceForAccessibility(java.lang.CharSequence) quando viene visualizzato il messaggio di errore. Apparentemente questo metodo sarà fallire automaticamente se la vista non è attualmente visibile. Nessun problema e altrimenti funziona perfettamente. Tuttavia, è disponibile solo nel livello API 16+ (Jelly Bean), il che limita davvero la sua utilità. Deve esserci una soluzione migliore dal momento che TalkBack supporta l'API 7+.

Ho visto le sessioni di I/O di Google 2011 e 2012 sull'accessibilità, ma nessuna delle due sembra coprire questo caso di utilizzo di base. Qual'è il miglior modo per farlo?

Modifica 1: TLDR; C'è un modo per forza TalkBack per leggere del testo ad alta voce prima dell'introduzione di View#announceForAccessibility(java.lang.CharSequence) in Jelly Bean?

+0

Come stanno inserendo il PIN? Se tramite un 'EditText', hai considerato l'utilizzo di' setError() 'invece di un separato' TextView'? La mia ipotesi è che 'setError()' sarà già legato al framework di a11y. – CommonsWare

+0

Il layout contiene una tastiera virtuale personalizzata costituita dalle viste di 'Button' 0-9 utilizzate per fornire input. Le cifre non sono visualizzate in un 'EditText', quindi sfortunatamente' setError() 'non è un'opzione. Buona idea però. Il layout è molto simile al layout della schermata di sblocco di Google Wallet, se è utile. – twaddington

+0

per il record, setError non produrrà un annuncio del testo dell'errore tramite TalkBack a meno che l'utente non prema specificatamente su di esso (Esplora al tocco). L'ErrorPopup non sarà incluso nell'elenco delle schermate delle schermate, quindi la navigazione scorrendo non lo raggiungerà. Ciò significa che l'utente forse cieco deve sapere che il ErrorPopup esiste e dove è visualizzato o inciampare su di esso - che è lontano dal ragionevole UX. – straya

risposta

10

Dovresti essere in grado di utilizzare View.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) sul tuo TextView per attivare TalkBack nello stesso modo in cui lo farebbe View.requestFocus(). Poiché attiva solo l'evento e non mette a fuoco la vista, non dovrebbe bloccarsi dopo la prima volta.

+0

Ho appena confermato che funziona davvero in Gingerbread. Grazie per la soluzione concisa! – twaddington

8

Stavo usando la risposta accettata, che funziona bene. Tuttavia, non mi piaceva il suono fuorviante quando il focus dell'accessibilità era impostato sulla vista testuale - lo stesso suono di quando l'input focus è dato a un EditField toccando due volte (una sorta di suono aperto dal cassetto), perché l'input focus non è stato effettivamente spostato da EditText con inputfocus (ad esempio con il cursore).

Così ho provato:

m_textView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);` 

ed è interessante notare funziona - l'etichetta viene letta, senza spostare alcuna messa a fuoco o dare qualsiasi altro suono.

1

Un altro modo potrebbe essere, quando TalkBack è attivato, inoltre mostrare un messaggio di Brindisi con il testo dell'errore. Questo viene anche letto ad alta voce.

+0

Confermo anche questa soluzione, che funzionerà bene. – Mohammad

0

Il modo consigliato è utilizzare il codice seguente dopo la modifica della visualizzazione del testo.

textview.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT); 

Legge i contenuti senza concentrarsi su di esso.

Problemi correlati