10

我有一个解锁屏幕,提示用户输入一个四位数的密码。如果用户错误地输入了他们的密码,TextView则会显示以前不可见的内容和错误消息。此时,TalkBack 可以大声读出错误消息的内容。

通过一些实验,我意识到我可以设置android:focusableInTouchMode="true"视图并以编程方式调用View#requestFocus(). 这第一次有效,但由于视图已经具有焦点,因此在后续错误中失败。此外,一般来说,覆盖当前视图焦点似乎是个坏主意。

然后我尝试View#announceForAccessibility(java.lang.CharSequence)在显示错误消息时调用。显然,如果视图当前不可见,此方法将静默失败。没问题,否则它工作得很好。但是,它仅在 API 级别 16+(Jelly Bean)中可用,这确实限制了它的实用性。由于 TalkBack 支持 API 级别 7+,因此必须有更好的解决方案。

我已经观看了 2011 年和 2012 年关于可访问性的 Google I/O 会议,但似乎都没有涵盖这个基本用例。最好的方法是什么?

编辑 1: TLDR;有没有办法强制View#announceForAccessibility(java.lang.CharSequence)TalkBack 在引入Jelly Bean之前大声朗读一些文本?

4

5 回答 5

11

您应该能够以与您相同的方式使用View.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)您的TextView来触发 TalkBack View.requestFocus()。因为它只触发事件,并没有真正关注视图,所以它不应该在第一次之后崩溃。

于 2012-11-09T06:20:35.477 回答
9

我使用的是公认的答案,效果很好。但是,我不喜欢在文本视图上设置可访问性焦点时的误导性声音 - 与通过双击(一种抽屉打开声音)将输入焦点赋予 EditField 时相同的声音,因为输入焦点实际上并没有从带有 inputfocus 的 EditText 移动(例如,带有光标)。

所以我尝试了:

m_textView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);`

有趣的是,它有效 - 读取标签,无需移动任何焦点或发出任何其他声音。

于 2013-05-14T18:48:40.253 回答
2

好的,如果您使用 L 或更高版本,更好的答案是使用: http: //developer.android.com/reference/android/view/View.html#setAccessibilityLiveRegion(int)

这将为您完成所有工作。

于 2014-10-29T21:09:26.327 回答
2

另一种方法是,在激活 TalkBack 时,另外显示一条带有错误文本的 Toast 消息。这也被大声读出。

于 2015-05-07T12:21:43.457 回答
0

推荐的方法是在 textview 更改后使用以下代码。

textview.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT);

它将阅读内容而不专注于它。

于 2016-12-29T10:06:17.700 回答