7

在我的 Android 应用程序中,我有一个View显示图像并具有关联的ContentDescription.

我可以启用Settings->Accessibility->Talkback,在 Talkback 设置中使用Explore By Touch,然后单击 View 以ContentDescription大声朗读。

到目前为止,这一切都符合预期。

但是,如果我再次单击相同的内容,我希望通过触摸进行探索。例如,我的图像和描述可能会在它有 时更新,所以说新短语对用户会有帮助。我怎样才能做到这一点?ContentDescriptionViewAccessibilityFocus

我尝试过使用View.clearFocus()and View.invalidate(),但没有成功。

欢迎任何建设性的想法。

更新

我还应该提到我想从 API 8 开始添加支持。因此,我正在尽我所能使用 API 4 的辅助功能接口。

我目前正在研究一种解决方案,用于View.clearFocus()解决View.requestFocus()更新视图问题。到目前为止,这似乎在我使用 API 8 和 16 的测试套件上有效。

我将再次更新最终结果,但欢迎在此期间提供进一步的建议。

4

1 回答 1

12

正如我在问题中所承诺的,这是我的调查结果和可行的解决方案。

首先,非常感谢 alanv 的帮助和支持,并为后来的 API(14 及更高版本)回答了问题。尽管他没有找到旧 API 的解决方案,但他确实提供了帮助我找到答案的关键信息。

AccessibilityEvent在撰写本文时,由于 TalkBack 中的一个已知错误,无法构建成功的口语- 请参阅发送未链接到视图的辅助功能事件以获取更多详细信息。如果事件源为空,则 TalkBack (v3.5.0_r105) 会忽略该事件,并且AccessibilityEvent.setSource(View)最初出现在API 14中,因此无法在此之前设置源 - 请参阅Google Eyes-Free 问题 #379

但是,可以使用我之前暗示的方法让 Android生成此类事件。View.requestFocus()

  1. 使用以下方法使您的视图在其XML 布局中具有焦点:

    android:focusable="true"
    android:focusableInTouchMode="true"

  2. View.setContentDescription(text)如果语音文本是静态的,则在 XML 布局中使用inActivity.onCreate或 with设置语音文本android:contentDescription="text",或者在必要时在代码中动态设置。

  3. 当需要语音文本时,将焦点移至正确的视图,使用View.requestFocus()触发AccessibilityEvent.

  4. 为确保重复短语(我的原始问题),请View.clearFocus()在上一步中请求焦点之前致电。

我有一个在 API 8 上工作的经过测试的实现,它也适用于 API 16。它应该一直工作到 API 4,当Accessibility API首次引入时。

仅支持较新的 Android API(14 及更高版本)的开发人员可能不需要此解决方案,但我相信目前对于支持早期 API 中的可访问性的开发人员而言,几乎没有其他选择。祝你好运。

更新

不幸的是,alanv 的答案似乎已经消失了——可能被删除了——连同评论中的所有相关细节和讨论。我试图重新抓住以下要点。

  1. 对于 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); }

  2. 对于 Android API 16 及更高版本,View.announceForAccessibility(text)可以使用。

于 2014-08-06T13:13:05.347 回答