2012-11-03 29 views
7

Tôi có màn hình mở khóa nơi người dùng được nhắc nhập mã pin gồm bốn chữ số. Nếu người dùng nhập mã pin của họ không chính xác, trước đây vô hình TextView được hiển thị cùng với thông báo lỗi. Tại thời điểm này, sẽ rất hữu ích cho TalkBack để đọc to nội dung của thông báo lỗi.Khi sử dụng TalkBack, cách ưa thích để cảnh báo người dùng khi nội dung của TextView đã thay đổi là gì?

Thông qua một số thử nghiệm, tôi nhận ra rằng tôi có thể đặt android:focusableInTouchMode="true" trên chế độ xem và gọi theo chương trình View#requestFocus(). Điều này hoạt động lần đầu tiên, nhưng không thành công trên các lỗi tiếp theo vì chế độ xem đã có tiêu điểm. Ngoài ra nó có vẻ như một ý tưởng tồi nói chung để ghi đè tập trung xem hiện tại.

Sau đó, tôi đã thử gọi View#announceForAccessibility(java.lang.CharSequence) khi thông báo lỗi hiển thị. Rõ ràng phương pháp này sẽ âm thầm không nếu chế độ xem hiện không hiển thị. Không có vấn đề và nếu không nó hoạt động hoàn hảo. Tuy nhiên, nó chỉ có sẵn trong API cấp 16+ (Jelly Bean) mà thực sự giới hạn tính hữu dụng của nó. Phải có giải pháp tốt hơn vì TalkBack hỗ trợ API cấp 7 trở lên.

Tôi đã xem cả phiên I/O Google 2011 và 2012 về trợ năng, nhưng dường như không bao gồm trường hợp sử dụng cơ bản này. Cách tốt nhất để làm điều này là gì?

Chỉnh sửa 1: TLDR; Có cách nào để buộc TalkBack đọc to văn bản trước khi giới thiệu View#announceForAccessibility(java.lang.CharSequence) trong Jelly Bean không?

+0

Họ nhập mã PIN như thế nào? Nếu thông qua một 'EditText', bạn đã xem xét sử dụng' setError() 'thay vì một' TextView' riêng biệt chưa? Tôi đoán là 'setError()' sẽ được gắn vào khuôn khổ a11y rồi. – CommonsWare

+0

Bố cục chứa bàn phím mềm tùy chỉnh được tạo thành từ các nút 'Nút' 0-9 được sử dụng để cung cấp đầu vào. Các chữ số không được hiển thị trong 'EditText', do đó không may' setError() 'không phải là một tùy chọn. Ý tưởng tốt mặc dù. Bố cục rất giống với bố cục màn hình mở khóa Google Wallet nếu bố cục đó hữu ích. – twaddington

+0

cho bản ghi, setError sẽ không đưa ra thông báo về văn bản lỗi qua TalkBack trừ khi người dùng nhấn cụ thể vào nó (Khám phá bằng cách chạm). ErrorPopup sẽ không được bao gồm trong danh sách chế độ xem màn hình, do đó việc điều hướng bằng cách vuốt sẽ không đến được. Điều này có nghĩa là người dùng có thể mù phải biết rằng ErrorPopup tồn tại và nơi nó được hiển thị hoặc vấp ngã khi nó - đó là cách xa UX hợp lý. – straya

Trả lời

10

Bạn sẽ có thể sử dụng View.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) trên TextView để kích hoạt TalkBack theo cách tương tự mà View.requestFocus() sẽ làm. Vì nó chỉ kích hoạt sự kiện và không thực sự tập trung vào Chế độ xem nên nó sẽ không bị lỗi sau lần đầu tiên.

+0

Tôi vừa xác nhận rằng điều này thực sự hiệu quả trong Gingerbread. Cảm ơn các giải pháp ngắn gọn! – twaddington

8

Tôi đã sử dụng câu trả lời được chấp nhận, hoạt động tốt. Tuy nhiên, tôi không thích âm thanh gây hiểu lầm khi tập trung vào khả năng truy cập được đặt ở chế độ xem văn bản - âm thanh giống như khi lấy tiêu điểm vào EditField bằng cách nhấn đúp (một loại âm thanh mở ngăn kéo), vì tiêu điểm nhập đã không thực sự di chuyển từ EditText với inputfocus (ví dụ như với con trỏ).

Vì vậy, tôi đã cố gắng:

m_textView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);` 

và thú vị nó hoạt động - nhãn được đọc, không nhúc nhích bất kỳ tập trung hoặc đưa ra bất kỳ âm thanh khác.

1

Một cách khác là, khi TalkBack được kích hoạt, hãy hiển thị thêm tin nhắn Bánh mì nướng với văn bản lỗi. Điều này cũng được đọc to.

+0

Tôi xác nhận giải pháp này là tốt, điều đó sẽ hoạt động tốt. – Mohammad

0

Cách được khuyến nghị là sử dụng mã bên dưới sau khi thay đổi văn bản.

textview.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT); 

Nó sẽ đọc nội dung mà không tập trung vào nó.