2012-11-03 4 views
7

Ich habe einen Entsperrbildschirm, wo der Benutzer aufgefordert wird, einen vierstelligen Pin einzugeben. Wenn der Benutzer seine PIN falsch eingibt, wird eine zuvor unsichtbare TextView mit einer Fehlermeldung angezeigt. An dieser Stelle wäre es sinnvoll, dass TalkBack den Inhalt der Fehlermeldung laut liest.Was ist bei Verwendung von TalkBack der bevorzugte Weg, um den Benutzer zu warnen, wenn sich der Inhalt einer TextView geändert hat?

Durch einige Experimente erkannte ich, dass ich android:focusableInTouchMode="true" in der Ansicht festlegen und programmgesteuert View#requestFocus() aufrufen konnte. Dies funktioniert das erste Mal, scheitert jedoch bei nachfolgenden Fehlern, da die Ansicht bereits fokussiert ist. Außerdem scheint es im Allgemeinen eine schlechte Idee zu sein, den Fokus der aktuellen Ansicht zu überschreiben.

Ich habe dann versucht View#announceForAccessibility(java.lang.CharSequence) aufrufen, wenn die Fehlermeldung angezeigt wird. Anscheinend wird diese Methode stumm fehlschlagen, wenn die Ansicht derzeit nicht sichtbar ist. Kein Problem und ansonsten funktioniert es perfekt. Allerdings ist es nur in API-Level 16+ (Jelly Bean) verfügbar, was seine Nützlichkeit wirklich einschränkt. Es muss eine bessere Lösung geben, da TalkBack API Level 7+ unterstützt.

Ich habe beobachtet, sowohl die 2011 und 2012 Google I/O-Sitzungen auf Zugänglichkeit, aber weder scheint diesen grundlegenden Anwendungsfall abzudecken. Was ist der beste Weg, dies zu tun?

Edit 1: TLDR; Gibt es einen Weg zu force TalkBack, etwas Text vor der Einführung von View#announceForAccessibility(java.lang.CharSequence) in Jelly Bean zu lesen?

+0

Wie geben sie die PIN ein? Wenn Sie über 'EditText' nachdenken, verwenden Sie' setError() 'statt einer separaten' TextView'? Ich vermute, dass 'setError()' bereits in das a11y-Framework eingebunden ist. – CommonsWare

+0

Das Layout enthält ein benutzerdefiniertes Soft-Tastenfeld, das aus den 'Button'-Ansichten 0-9 besteht, die zur Eingabe verwendet werden. Die Ziffern werden nicht in 'EditText' angezeigt, daher ist 'setError()' leider keine Option. Gute Idee aber. Das Layout ist dem Layout des Google Wallet-Entsperrbildschirms sehr ähnlich, wenn dies hilfreich ist. – twaddington

+0

für den Datensatz, SetError wird keine Ankündigung des Fehlers Text über TalkBack, sofern der Benutzer nicht ausdrücklich darauf drückt (Explore by Touch). Die ErrorPopup-Datei wird nicht in die Bildschirmliste der Ansichten aufgenommen, sodass das Navigieren durch Wischen nicht möglich ist. Dies bedeutet, dass der möglicherweise blinde Benutzer wissen muss, dass das ErrorPopup existiert und wo es angezeigt wird oder darüber stolpert - was weit entfernt von vernünftigem UX ist. – straya

Antwort

10

Sie sollten View.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) auf Ihrem TextView verwenden können, TalkBack auf die gleiche Weise wie View.requestFocus() auslösen würde. Da es nur das Ereignis auslöst und die Ansicht nicht wirklich fokussiert, sollte es nicht nach dem ersten Mal abstürzen.

+0

Ich habe gerade bestätigt, dass dies tatsächlich in Gingerbread funktioniert. Danke für die prägnante Lösung! – twaddington

8

ich die akzeptierte Antwort wurde mit, was gut funktioniert. Allerdings mochte ich das irreführende Geräusch nicht, wenn der Fokus der Eingabehilfen auf die Textansicht eingestellt war - der gleiche Klang wie bei der Eingabe von Fokus auf ein EditField durch zweimaliges Antippen (eine Art Schublade-Open-Sound), weil der Eingabefokus war nicht wirklich aus dem EditText mit Eingabefokus (zB mit Cursor) verschoben.

Also habe ich versucht:

m_textView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);` 

und interessanterweise funktioniert es - das Etikett gelesen wird, ohne dass Fokus bewegt oder anderen Klang.

1

Eine andere Möglichkeit wäre, wenn Talkback aktiviert ist, zeigen zusätzlich eine Toast Nachricht mit dem Fehlertext. Dies wird auch laut vorgelesen.

+0

Ich bestätige diese Lösung auch, das wird gut funktionieren. – Mohammad

0

empfohlene Methode ist es, den Code unten nach Textview Änderung zu verwenden.

textview.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT); 

Es wird den Inhalt lesen, ohne sich darauf zu konzentrieren.