我在我的安卓应用中有一个WebView,但当TalkBack启用时,它会将焦点集中在整个视图上,用户必须滑动到下一个项目才能开始听取WebView内容。是否有任何方法可以跳过选择WebView并直接选择内容?
我在我的安卓应用中有一个WebView,但当TalkBack启用时,它会将焦点集中在整个视图上,用户必须滑动到下一个项目才能开始听取WebView内容。是否有任何方法可以跳过选择WebView并直接选择内容?
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延迟读取内容,你会指示用户需要等待吗?如果有加载动画/公告,那么就需要考虑很多复杂的事情,比如确保用户可以关闭动画,并且不仅仅宣布“正在加载”,而是宣布正在加载什么,如果加载需要很长时间,用户也需要得到及时的通知......