Android 如何在显示 RelativeLayout 时让 TalkBack 读取文本

7
我有一个活动,使用以下代码将自定义视图添加到整个活动的视图中。
activity.getWindow().getDecorView()).addView(newView)

为了显示教练标记/用户提示屏幕。
我的自定义视图扩展自RelativeLayout,在其构造函数中添加了一个按钮,该按钮位于屏幕底部,当点击它时,会关闭视图。
我已经重写了 "dispatchDraw" 方法,以便可以在特定位置将多个教练标记 UI 对象 (textviews 和 bitmaps) 添加到布局中。这些教练标记对象使用以下代码在视图上绘制自己。
        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:是否有办法让TalkBack在单击textview和bitmap时朗读出内容? - 我已经尝试设置textviews和bitmaps的contentDescriptions和focusable,但这没有任何区别。

问题2:另一种方法是在自定义视图显示时让TalkBack读出一些内容,并且这些文本可以总结屏幕上显示的所有教练标记。我无法弄清楚如何做到这一点,有人有什么建议吗? - 我已经尝试将我的customView设置为可聚焦(setFocasable(true))并给它一个contentDescription,但这并不起作用。 - 当自定义视图被绘制时,我尝试发起一个操作,然后添加一个事件的content description,但这也不起作用,即

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");
}
1个回答

12

我最近也遇到了类似的问题。

简短的答案是,如果你使用的是Android API 16或更高版本,则在需要触发TalkBack时使用View.announceForAccessibility(text)。请参见Android文档

但是,如果你想支持早期的Android API,则需要使用View.requestFocus(),这需要更多的操作。我在这里概述了如何做:Android:如何强制Explore-By-Touch/Talkback重复当前视图的ContentDescription?

我还建议你查看一下我针对Google Eyes-Free代码提出的一些错误报告,这可能会节省你一些浪费的时间:


@Sarah Maslin 你解决了你的问题吗?我很想知道结果。 - AwayTeam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接