Android:如何强制Touch-By-Touch / Talkback重复AccessibilityFocus中当前视图的ContentDescription?

时间:2014-07-17 17:01:35

标签: android accessibility talkback

在我的Android应用中,我有一个显示图片的View,并且已关联ContentDescription

我可以通过对讲设置启用设置 - >辅助功能 - >对讲通过触摸浏览,然后点按视图即可阅读{ {1}}大声。

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

但是,如果我再次点击相同的ContentDescription,我希望触摸浏览重复ContentDescription。例如,我的图片和说明可能会在View时更新,因此说新短语会对用户有所帮助。我怎样才能做到这一点?

我尝试过AccessibilityFocusView.clearFocus(),但没有成功。

欢迎任何有建设性的想法。

更新

我还应该提到我想从API 8开始添加支持。因此,我正在尝试使用API​​ 4的Accessibility接口尽力而为。

我目前正在开发一种解决方案,该解决方案使用View.invalidate()后跟View.clearFocus()来解决更新后的问题。到目前为止,这似乎在我的测试工具包中使用API​​ 8和16。

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

1 个答案:

答案 0 :(得分:8)

正如我的问题所承诺的,以下是我的调查结果和工作解决方案。

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

在撰写本文时,由于TalkBack中的已知错误,无法构建成功说出的AccessibilityEvent - 有关详细信息,请参阅Send accessibility event not linked to view。如果事件源为null,则TalkBack(v3.5.0_r105)将忽略该事件,并且AccessibilityEvent.setSource(View)首次出现View.requestFocus(),因此无法在此之前设置源 - 请参阅{{ 3}}

但是,正如我之前所暗示的那样,可以使用android:focusable="true"来制作Android 生成此类事件。

  1. 使用以下内容{/ 3}}使您的视图可关注:

    android:focusableInTouchMode="true"
    View.setContentDescription(text)

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

    < / LI>
  3. 当需要语音文字时,使用AccessibilityEvent将焦点移至正确的视图以触发View.clearFocus()

  4. 要确保重复短语(我的原始问题),请在上一步请求重点之前致电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); }

  5. 我已经在API 8上使用了这种方法的经过测试的实现,它也适用于API 16.当API 14首次引入时,它应该可以一直回到API 4。

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

    <强>更新

    不幸的是,阿兰夫的答案似乎已经消失 - 可能已删除 - 在评论中考虑了所有相关细节和讨论。我试图重新获得以下要点。

    1. 对于Android API 14及更高版本,可以按如下方式创建重点事件:

      View.announceForAccessibility(text)

    2. 对于Android API 16及更高版本,可以使用{{1}}。