6

我有一个活动,它使用以下代码将自定义视图添加到整个活动的视图中

activity.getWindow().getDecorView()).addView(newView)

为了显示教练标记/用户提示屏幕。

我的自定义视图从 RelativeLayout 扩展,并在其构造函数中在屏幕底部添加了一个按钮,单击该按钮会关闭视图。

我已经覆盖了“dispatchDraw”方法,这样我就可以将多个coachmark UI 对象(文本视图和位图)添加到特定位置的布局中。这些 coachmark 对象使用如下代码在视图上绘制自己

        canvas.save();
        canvas.translate(positioning[0], positioning[1]);
        textView.draw(canvas);
        canvas.restore();

        canvas.save();
        canvas.drawBitmap(bitmap, positioning[2], positioning[3], new Paint());
        canvas.restore();

问题:启用 TalkBack 时

  • 当显示此教练标记视图时,该视图不会大声读出任何内容
  • 如果用户按下文本视图和位图所在的位置,则不会大声读出任何内容

然而,当用户按下按钮时,按钮的 contentDescription 会被大声读出。

我认为 textViews 和 Bitmaps 没有被读出的原因是由于我上面的代码在画布上呈现它们的方式。

问题 1:当点击 textview 和 bitmaps 时,有没有办法让 TalkBack 大声说出来?- 我尝试为 textviews 和 bitmaps 设置 contentDescriptions 和 focusable ,但这没有任何区别。

问题 2:另一种方法是让 TalkBack 在显示自定义视图时读出一些内容,并且此文本可以总结屏幕上显示的所有指导标记。我不知道该怎么做,有人有什么建议吗?- 我已经尝试将我的 customView 设置为可聚焦(setFocasable(true) 并给它一个 contentDescription,但这不起作用。 - 我尝试在绘制自定义视图时发起一个操作,然后向事件添加内容描述,但这也不起作用,即

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
}

@Override
public void onInitializeAccessibilityNodeInfo (AccessibilityNodeInfo info) {
    super.onInitializeAccessibilityNodeInfo(info);
    // this is not read out load when the view is displayed, but is read when the view is pressed
    info.setContentDescription("on Initialize Accessibility Node Info User Tips");
}
4

1 回答 1

10

我最近一直在努力解决类似的问题。

简短的回答是View.announceForAccessibility(text)在您希望触发 TalkBack 时使用,假设您使用的是 Android API 16 或更高版本 - 请参阅Android 文档

但是,如果您想支持早期的 Android API,使用 有一个更复杂的答案View.requestFocus(),我在这里概述了:Android: How to force Explore-By-Touch/Talkback to repeat the ContentDescription of the current View in AccessibilityFocus?

我还建议您查看我针对 Google 的 Eyes-Free 代码提出的几个错误,这可能会为您节省一些浪费的精力:

于 2014-08-13T15:00:44.777 回答