Android跳过WebView的焦点,直接使用TalkBack进入内容



我的Android应用程序中有一个WebView,但当启用TalkBack时,它会关注整个视图,用户必须滑动到下一个项目才能开始听到WebView内容。有没有任何方法可以跳过WebView的选择,直接跳到选择内容?

在尝试过之后,我不这么认为(见下文(。至少目前还没有(我认为你应该考虑在谷歌的IssueTracker上提出问题,但你需要向他们提供更多细节(。最好的方法是将Role属性分配给其他对象,或者设置ContentDescription,但我也没有成功。

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

这里的主要问题是,您试图向可访问性用户隐藏某些内容,并在不必要时以编程方式更改焦点。WCAG指南3.2.1";聚焦";状态:

在没有直接确认(例如,确认按钮(的情况下,不应在关注界面中的任何元素(例如,打开模式窗口(时发生可能使任何人迷失方向的上下文更改。

这一点之所以重要,是因为当用户浏览网页时,他们会输入一个新的";模式";这可能与原生Android体验略有不同。如果用户不知道自己正在浏览网络内容,这可能会让他们迷失方向。不过,这只是一个纯粹的猜测,我只是一个开发人员,而不是一个可访问性专家。

以下是我在研究这个问题时所做的一些尝试。

我在布局中创建了一个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为导航做准备的方法。这也是一个谨慎的提醒,在突出显示组件时,有一个焦点方向的概念。如果您要绕过Web视图,您将自动选择FIRST元素还是LAST元素?(当然,假设你能找到元素并为它们指定焦点(。

还有一个问题:加载时间。如果WebView在读取内容时延迟,您是否会指示用户需要等待?如果有加载动画/公告,那么需要考虑一大堆复杂性,比如确保用户可以关闭动画,而且它不仅仅是公告";加载";但是正在加载什么,并且如果加载需要很长时间,用户会得到通知。。。

最新更新