微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android 跳过 WebView 的焦点并使用 TalkBack 直接转到内容

如何解决Android 跳过 WebView 的焦点并使用 TalkBack 直接转到内容

我的 Android 应用中有一个 WebView,但是当启用 TalkBack 时,它专注于整个视图,用户必须滑动到下一个项目才能开始收听 WebView 内容。有什么办法可以跳过WebView的选择,直接跳转到选择内容

解决方法

我不这么认为,在尝试之后(见下文)。至少现在不是(我认为您应该考虑在 Google 的 IssueTracker 上提出问题,但您需要向他们提供更多详细信息)。您可能会做的最好的事情是将 Role 属性分配给其他东西,或者设置 ContentDescription,但我也没有运气。

看了这个问题一段时间后。我认为 Google 没有满足这一点的主要原因是,也许用户应该意识到 WebView 正在使用中(可能是在挖掘基于 Web 的跨平台?)。

这里的主要问题是您试图对可访问性用户隐藏某些内容,并在不必要时以编程方式更改焦点。 WCAG guidelines 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" 但这意味着整个视图和子项都被跳过了。

所以我将一个 AccessibilityDelegate 附加到 WebView 并为所有可能的事件制作了一些日志,以查看哪个是在焦点上触发的,而每次触发的唯一一个是 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,是要自动选择FIRST 元素还是LAST 元素? (当然,假设您可以找到元素并为其分配焦点)。

还有一个问题:加载时间。如果WebView在读取内容时出现延迟,您是否会指示用户需要等待?如果有加载动画/公告,则需要考虑很多复杂性,例如确保用户可以关闭动画,并且它不只是公告“正在加载”,而是什么已加载,如果加载时间过长,用户会收到通知...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。