我有一个解锁屏幕,用户将被提示输入四位数针。 如果用户错误地输入他们的销,以前看不见TextView
被示出具有错误消息。 在这一点上的话语提示读取错误消息的内容大声这将是有益的。
通过一些实验,我意识到我可以设置android:focusableInTouchMode="true"
的观点,并以编程方式调用View#requestFocus()
。 此作品是第一次,但未能在随后的错误,因为视图已经拥有焦点。 此外,它似乎是在一般一个坏主意,覆盖当前视图的焦点。
然后,我尝试调用View#announceForAccessibility(java.lang.CharSequence)
显示错误消息时。 显然,如果视图当前不可见此方法将静默失败 。 没问题,否则它完美的作品。 然而,这只是API等级16+(果冻豆),这确实限制了它的实用性可用。 必须有一个更好的解决方案,因为话语提示支持API级别7+。
我看过无障碍无论是2011年和2012谷歌I / O会议上,但也似乎掩盖这一基本用例。 什么是做到这一点的最好方法是什么?
编辑1:TLDR; 有没有办法迫使话语提示响亮引进之前,读一些文本进行View#announceForAccessibility(java.lang.CharSequence)
在果冻豆?
您应该能够使用View.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)
在你TextView
触发话语提示在以同样的方式View.requestFocus()
会。 因为它只有触发事件,而实际上并没有集中视图,它不应该在第一时间之后崩溃。
我用的是接受的答案,效果很好。 但是,我不喜欢的声音误导时可访问重点是在文本视图设置 - 同样的声音,当输入焦点是双攻(类似抽屉开声的)给予的EditField中的,因为输入焦点实际上并没有从使用的EditText移动inputfocus(例如用光标)。
所以我想:
m_textView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);`
有趣的是它的工作原理 - 标签被读取,而不移动任何焦点或提供其他任何声音。
OK,如果你使用的是L或更高更好的答案是使用: http://developer.android.com/reference/android/view/View.html#setAccessibilityLiveRegion(int)
这将做所有的工作适合你。
另一种方法是,当话语提示被激活,还显示有错误文本敬酒消息。 这也被读出大声。
推荐的方法是TextView的变化后使用下面的代码。
textview.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT);
它会读取其中的内容,而不关注它。
文章来源: When using TalkBack, what is the preferred way to alert the user when the contents of a TextView have changed?