在我的 Android 应用程序中,我有一个View
它显示图像并具有关联的ContentDescription
.
我可以启用设置->辅助功能->对讲, with 触摸探索从“对讲”设置中,然后单击“视图”以阅读ContentDescription
aloud.
到目前为止,这一切都符合预期。
不过,我想触摸探索重复ContentDescription
如果我单击相同的View
再次。例如,我的图像和描述可能会更新,但它具有AccessibilityFocus
,因此说出新短语会对用户有所帮助。我怎样才能实现这个目标?
我尝试过尝试View.clearFocus()
and View.invalidate()
,但没有成功。
任何有建设性的想法都将受到欢迎。
Update
我还应该提到,我想从 API 8 开始添加支持。因此,我尝试尽我所能使用 API 4 的辅助功能接口。
我目前正在研究一个使用的解决方案View.clearFocus()
其次是View.requestFocus()
解决更新视图问题。到目前为止,这似乎在我的 API 8 和 16 测试套件上有效。
我将再次更新最终结果,但欢迎在此期间提出进一步的建议。
正如我在问题中所承诺的,这是我的调查结果和可行的解决方案。
首先,非常感谢 alanv 的帮助和支持,以及回答后续 API(14 及以上)的问题。尽管他没有找到旧 API 的解决方案,但他确实提供了帮助我找到答案的关键信息。
在撰写本文时,还不可能构建一个成功的口语AccessibilityEvent
,由于 TalkBack 中的一个已知错误 - 请参阅发送未链接到视图的辅助功能事件了解更多详情。如果事件源为 null,则 TalkBack (v3.5.0_r105) 会忽略该事件并作为AccessibilityEvent.setSource(View)
首次出现于API 14,不可能在此之前设置源 - 请参阅Google Eyes-Free 问题 #379
不过安卓还是可以的generate此类事件通过使用View.requestFocus()
正如我之前暗示的那样。
-
使您的视图可聚焦于其XML布局 using:
android:focusable="true"
android:focusableInTouchMode="true"
使用设置语音文本View.setContentDescription(text)
in Activity.onCreate
或与android:contentDescription="text"
如果是静态的,则在 XML 布局中;如果需要,则在代码中动态地进行。
当需要语音文本时,使用以下命令将焦点移至正确的视图View.requestFocus()
触发一个AccessibilityEvent
.
为了确保重复某个短语(我原来的问题),请致电View.clearFocus()
在上一步中请求焦点之前。
我已经在 API 8 上测试了此方法的实现,它也适用于 API 16。它应该一直工作到 API 4,当辅助功能 API首次被介绍。
对于只支持较新的 Android API(14 及更高版本)的开发人员来说,可能不需要此解决方案,但我相信目前对于那些支持早期 API 中的辅助功能的开发人员来说,几乎没有其他选择。祝你好运。
Update
不幸的是,alanv 的答案似乎已经消失 - 可能被删除 - 连同评论中所有相关的细节和讨论。我试图重新捕捉以下要点。
-
对于 Android API 14 及更高版本,可以按如下方式创建焦点事件:
if (mAccessibilityService.isEnabled()) {
AccessibilityEvent event = AccessibilityEvent.obtain(
AccessibilityEvent.TYPE_VIEW_FOCUSED);
event.setSource(myView); // API 14 & later
event.setClassName(myView.getClass().getName());
event.setPackageName(myView.getContext().getPackageName());
event.setEnabled(true);
event.setContentDescription(text);
myView.sendAccessibilityEventUnchecked(event);
}
对于 Android API 16 及更高版本,View.announceForAccessibility(text)
可以使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)