【问题标题】:Android: How to force Explore-By-Touch/Talkback to repeat the ContentDescription of the current View in AccessibilityFocus?Android:如何强制Explore-By-Touch/Talkback在辅助功能焦点中重复当前视图的内容描述?
【发布时间】:2014-08-13 23:42:27
【问题描述】:

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

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

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

但是,如果我再次单击相同的 View,我希望 Explore By Touch 重复 ContentDescription。例如,我的图像和描述可能会在它有AccessibilityFocus 时更新,所以说新短语对用户会有帮助。我怎样才能做到这一点?

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

欢迎任何建设性的想法。

更新

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

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

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

【问题讨论】:

    标签: android accessibility talkback


    【解决方案1】:

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

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

    在撰写本文时,由于 TalkBack 中的一个已知错误,无法构建成功说出的 AccessibilityEvent - 请参阅 Send accessibility event not linked to view 了解更多详细信息。如果事件源为空,则 TalkBack (v3.5.0_r105) 将忽略该事件,并且由于 AccessibilityEvent.setSource(View) 首次出现在 API 14 中,因此无法在此之前设置源 - 请参阅 Google Eyes-Free issue #379

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

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

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

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

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

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

    我已经在 API 8 上测试了这种方法的实现,它也适用于 API 16。它应该可以一直工作到 API 4,那时 Accessibility API 首次引入。

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

    更新

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

    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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多