When using TalkBack, what is the preferred way to

2019-07-03 12:37发布

我有一个解锁屏幕,用户将被提示输入四位数针。 如果用户错误地输入他们的销,以前看不见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)在果冻豆?

Answer 1:

您应该能够使用View.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)在你TextView触发话语提示在以同样的方式View.requestFocus()会。 因为它只有触发事件,而实际上并没有集中视图,它不应该在第一时间之后崩溃。



Answer 2:

我用的是接受的答案,效果很好。 但是,我不喜欢的声音误导时可访问重点是在文本视图设置 - 同样的声音,当输入焦点是双攻(类似抽屉开声的)给予的EditField中的,因为输入焦点实际上并没有从使用的EditText移动inputfocus(例如用光标)。

所以我想:

m_textView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);`

有趣的是它的工作原理 - 标签被读取,而不移动任何焦点或提供其他任何声音。



Answer 3:

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

这将做所有的工作适合你。



Answer 4:

另一种方法是,当话语提示被激活,还显示有错误文本敬酒消息。 这也被读出大声。



Answer 5:

推荐的方法是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?