2012-11-03 30 views
7

Mam ekran odblokowania, w którym użytkownik jest monitowany o wprowadzenie czterocyfrowej szpilki. Jeśli użytkownik wprowadzi swój kod PIN niepoprawnie, poprzednio niewidoczny kod TextView zostanie wyświetlony z komunikatem o błędzie. W tym momencie TalkBack powinien przeczytać głośno treść komunikatu o błędzie.Podczas korzystania z TalkBack, jaki jest preferowany sposób powiadomienia użytkownika o zmianie treści TextView?

Przez niektóre eksperymenty zdałem sobie sprawę, że mogę ustawić android:focusableInTouchMode="true" w widoku i programowo wywołać View#requestFocus(). Działa to za pierwszym razem, ale kończy się niepowodzeniem w przypadku kolejnych błędów, ponieważ widok jest już skupiony. Poza tym ogólnie rzecz biorąc, ogólnie rzecz biorąc, jest to zły pomysł, aby nadpisać aktualny widok.

Próbowałem następnie wywołać View#announceForAccessibility(java.lang.CharSequence) po wyświetleniu komunikatu o błędzie. Najwyraźniej ta metoda będzie po cichu zawieść, jeśli widok nie jest obecnie widoczny. Żaden problem, w przeciwnym razie działa idealnie. Jest jednak dostępny tylko na poziomie API 16+ (Jelly Bean), który naprawdę ogranicza jego użyteczność. Musi istnieć lepsze rozwiązanie, ponieważ TalkBack obsługuje API poziomu 7+.

Oglądałem sesje Google I/O z 2011 i 2012 r. Dotyczące dostępności, ale wydaje mi się, że nie obejmują one tego podstawowego przypadku użycia. Jaki jest najlepszy sposób na zrobienie tego?

Edytuj 1: TLDR; Czy istnieje sposób, aby wymusić TalkBack, aby przeczytać jakiś tekst na głos przed wprowadzeniem View#announceForAccessibility(java.lang.CharSequence) w Jelly Bean?

+0

W jaki sposób wprowadzają kod PIN? Jeśli przez "EditText", czy rozważałeś użycie 'setError()' zamiast osobnego 'TextView'? Domyślam się, że 'setError()' będzie już związany ze strukturą a11y. – CommonsWare

+0

Układ zawiera niestandardową klawiaturę programowalną, która składa się z widoków przycisków "0", które są używane do wprowadzania danych. Cyfry nie są wyświetlane w 'EditText', więc niestety' setError() 'nie jest opcją. Dobry pomysł. Układ jest bardzo podobny do układu ekranu odblokowywania Portfela Google, jeśli jest to pomocne. – twaddington

+0

dla rekordu, setError nie będzie wyświetlał komunikatu o błędzie za pośrednictwem TalkBack, chyba że użytkownik specjalnie naciśnie na niego (Explore by Touch). Funkcja ErrorPopup nie zostanie uwzględniona na liście ekranów widoków, więc nawigacja przez przesuwanie jej nie osiągnie. Oznacza to, że prawdopodobnie niewidomy użytkownik musi wiedzieć, że ErrorPopup istnieje i gdzie jest wyświetlany lub natknąć się na niego - co jest dalekie od rozsądnego UX. – straya

Odpowiedz

10

Powinieneś być w stanie użyć View.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) na swoim TextView, aby włączyć TalkBack w taki sam sposób, jak View.requestFocus(). Ponieważ wywołuje ono tylko zdarzenie i nie koncentruje się na widoku, po raz pierwszy nie powinno się zawieszać.

+0

Właśnie potwierdziłem, że to rzeczywiście działa w Gingerbread. Dzięki za zwięzłe rozwiązanie! – twaddington

8

Użyłem zaakceptowanej odpowiedzi, która działa dobrze. Nie podobało mi się jednak wprowadzające w błąd dźwięki, gdy ustawiono ostrość widoczności w widoku tekstowym - taki sam dźwięk, jak przy ustawianiu fokusa wejściowego do pola edycji przez dwukrotne stuknięcie (rodzaj dźwięku otwierania szuflady), ponieważ fokus wejściowy w rzeczywistości nie przestawił się z EditText z inputfocus (np. z kursorem).

Tak próbowałem:

m_textView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);` 

i co ciekawe to działa - etykieta jest czytany, nie poruszając żadnych ostrości lub podając żadnych innych dźwięków.

1

Innym sposobem jest, gdy po włączeniu TalkBack pojawi się komunikat Toast z tekstem błędu. To również jest czytane na głos.

+0

Potwierdzam również to rozwiązanie, które działa dobrze. – Mohammad

0

Zalecanym sposobem jest użycie poniższego kodu po zmianie widoku tekstu.

Będzie czytać zawartość bez skupiania się na nim.