Android跳过WebView的焦点,直接使用TalkBack访问内容

3

我在我的安卓应用中有一个WebView,但当TalkBack启用时,它会将焦点集中在整个视图上,用户必须滑动到下一个项目才能开始听取WebView内容。是否有任何方法可以跳过选择WebView并直接选择内容?


将来,查看你所做的事情(即使是创建玩具项目)和你已经尝试过的内容将非常有帮助。请考虑阅读 https://stackoverflow.com/help/how-to-ask。 - Quintin Balsdon
1个回答

3
我认为不行,我尝试过了(见下文)。至少目前不行(我认为你应该考虑在Google的IssueTracker上提出问题,但你需要向他们提供更多细节)。你最好能做的是将Role属性分配给其他内容,或者可能设置ContentDescription,但我对这些也没有成功。

经过一段时间的研究后,我认为谷歌还没有为此服务,主要原因是用户应该知道正在使用WebView(这可能是对基于Web跨平台的挖苦)。

这里的主要问题是,您正在尝试从辅助功能用户隐藏某些内容,并在不必要时通过编程方式更改焦点。 WCAG指南3.2.1“关于焦点”的规定如下:

在界面中,聚焦任何元素时不应出现任何可能使任何人感到迷惑的上下文更改(例如,打开模态窗口),而不需要直接确认(例如,确认按钮)。

这很重要,因为当用户浏览网页时,他们会进入一种新的导航“模式”,可能与本机Android体验略有不同。如果用户不知道他们正在浏览Web内容,则可能感到迷惑。那只是我的猜测,我只是一个开发人员,没有辅助功能方面的专业知识。

以下是我在研究问题时尝试的一些方法。

我在布局中创建了一个WebView,并能够复制您提到的行为:

<WebView
    android:id="@+id/webView"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    tools:ignore="WebViewLayout" />

起初我尝试使用android:importantForAccessibility="no",但这意味着整个视图及其子项都将被跳过。

因此,我为WebView附加了一个AccessibilityDelegate,并记录了所有可能的事件以查看哪个事件在焦点上触发,唯一每次触发的是onInitializeAccessibilityNodeInfo

override fun onResume() {
    super.onResume()
    ViewCompat.setAccessibilityDelegate(webView, a11yDelegate)
}

val a11yDelegate = object:AccessibilityDelegateCompat() {
    override fun onInitializeAccessibilityNodeInfo(
        host: View?,
        info: AccessibilityNodeInfoCompat?
    ) {
        log("a11yDelegate", "a11yDelegate onInitializeAccessibilityNodeInfo")
        //Now we know focus has occurred
        super.onInitializeAccessibilityNodeInfo(host, info)
    }
}

但我也注意到,当“兄弟”元素和子元素聚焦时,它也会触发。这是TalkBack为导航做准备的方法。它还谨慎地提醒了一个概念——在突出显示组件时有聚焦方向。如果你要绕过WebView,你会自动选择第一个元素还是最后一个元素呢?(当然,假设你能找到这些元素并将它们聚焦)。

还有一个问题:加载时间。如果WebView延迟读取内容,你会指示用户需要等待吗?如果有加载动画/公告,那么就需要考虑很多复杂的事情,比如确保用户可以关闭动画,并且不仅仅宣布“正在加载”,而是宣布正在加载什么,如果加载需要很长时间,用户也需要得到及时的通知......


1
很棒的答案!感谢您的调查。在我们的情况下,我们使用Webview来呈现从我们网站复制/粘贴的HTML,因此即使它是一个Webview,用户也不应该看到它。如果我们能够禁用Talkbalk Webview的公告,那就太好了,但我想我们唯一的选择是将我们的Webview转换为其他本地组件。 - Mitch Downey

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