在尝试之后我不这么认为(见下文)。至少现在不是(我认为你应该考虑在 Google 上提出问题问题追踪器 https://issuetracker.google.com,但您需要向他们提供更多详细信息)。你可能做的最好的事情就是分配Role https://developer.android.com/reference/androidx/core/view/accessibility/AccessibilityNodeInfoCompat#setRoleDescription(java.lang.CharSequence)属性为其他东西,或者可能设置ContentDescription https://developer.android.com/reference/androidx/core/view/accessibility/AccessibilityNodeInfoCompat#setContentDescription(java.lang.CharSequence),但我对这些也没有运气。
看了这个问题一段时间后。我认为 Google 没有考虑到这一点的主要原因是,也许用户应该意识到正在使用 WebView(可能是对基于 Web 的跨平台的挖掘?)。
这里的主要问题是,您试图向可访问性用户隐藏某些内容,并在不必要时以编程方式更改焦点。这WCAG 指南 3.2.1 https://www.w3.org/WAI/WCAG21/Understanding/on-focus“聚焦”状态:
如果没有直接确认(例如确认按钮),则不应因专注于界面中的任何元素(例如打开模式窗口)而发生可能使任何人迷惑的上下文更改。
为什么这很重要,因为当用户导航网页时,他们会进入一种新的导航“模式”,该模式可能与本机 Android 体验略有不同。如果用户没有意识到自己正在浏览网页内容,那么他们可能会迷失方向。但这纯粹是猜测,我只是一名开发人员,而不是可访问性专家。
以下是我在研究该问题时尝试的一些内容。
我在布局内创建了一个 WebView,并且能够复制您提到的行为:
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="200dp"
tools:ignore="WebViewLayout" />
最初我尝试过android:importantForAccessibility="no"
但这意味着整个视图和孩子都会被跳过。
所以我附上了一个AccessibilityDelegate https://developer.android.com/reference/androidx/core/view/AccessibilityDelegateCompat到 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,你会自动选择第一个元素还是最后一个元素? (当然假设您可以找到元素并为它们分配焦点)。
还有另一个问题:加载时间。如果WebView读取内容有延迟,你是否会指示用户需要等待?如果有加载动画/公告,则需要考虑大量的复杂性,例如确保用户可以关闭动画,并且它不仅仅宣布“正在加载”,而且what正在加载,如果加载时间较长,用户会收到通知...