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

2023-12-24

我的 Android 应用程序中有一个 WebView,但启用 TalkBack 后,它会聚焦于整个视图,用户必须滑动到下一个项目才能开始听到 WebView 内容。有没有办法跳过WebView的选择并直接跳到选择内容?


在尝试之后我不这么认为(见下文)。至少现在不是(我认为你应该考虑在 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正在加载,如果加载时间较长,用户会收到通知...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 跳过 WebView 焦点并使用 TalkBack 直接进入内容 的相关文章

  • 是否可以以编程方式更改操作栏选项卡指示器

    如何以编程方式更改操作栏的选定选项卡指示器 我读过关于选项卡样式 http developer android com guide topics ui actionbar html Style和 Tab setCustomView 方法 但
  • 序列化 ArrayList

    我正在尝试编写一个 Android 游戏 即使用户想要返回主菜单或者活动被系统终止 我也希望能够暂停游戏 onSaveInstanceState 似乎并没有给我很大的控制权来决定何时可以读回捆绑包 而且据我所知 捆绑包仅在短时间内有效 所以
  • 无法调用类的无参数构造函数。向 Gson 注册此类型的 InstanceCreator 可能会解决此问题

    java lang RuntimeException Unable to invoke no args constructor for class com arch example network models NetworkPagingL
  • 如何在无头Linux中更新Android平台工具?

    我们有一些没有安装 X Window 的 CI 主机 我知道如何使用 android 更新命令更新 SDK 但如何使用此命令更新平台工具 您可以使用以下命令 android list sdk android update sdk no ui
  • 如何在Android中创建类似架子的视图?

    如何在android中创建一个类似书架的视图 在任意行中显示多本书 此外 它应该具有像 Moon reader 应用程序那样的水平和垂直功能 我可以编写一个水平移动的架子视图 但它不能完全工作 我使用 xml 文件来查看包含图像 文本和按钮
  • Android studio 3.0不生成签名的apk

    将 android studio 更新到版本 3 0 Windows 后 我无法生成签名的 APK 构建完成后 我收到消息 单击 查找 会将我带到 APP 文件夹 但找不到 APK 改变了什么 自Android Studio 3 0更新后
  • 使用 OpenWeatherMap API 密钥

    我得到异常 http api openweathermap org data 2 5 weather q 悉尼 http api openweathermap org data 2 5 weather q Sydney 有人可以帮助如何使用
  • 最好使用的游戏/物理引擎?

    寻找用于移动游戏开发的游戏 物理引擎 iPhone 有Cocos2D http www cocos2d iphone org 我找到的安卓系统RokonAndroid http rokonandroid com 只是想知道是否还有其他人知道
  • GoogleMap 本质上是可打包的吗?

    我对java和android很陌生 我遇到了一个基本问题 在这个给定的fragment 我可以添加GoogleMap对象为parcelable没有任何额外的pracelable类为 public class SecondFragment e
  • 如何触发 Google Play 商店自动更新机制?

    简而言之 我希望我的应用程序在我向商店发布新的 APK 后立即更新 我找不到任何有关自动更新实际发生时间的信息 而且似乎变化很大 有一次是在几个小时后发生的 另一次是 12 小时没有更新 似乎是在设备重启时发生的 但是还有其他情况吗 我可以
  • Android - 带图像的按钮 - 禁用按钮时图像变暗

    在 Android 中 我有一个包含图像和文本的按钮 禁用该按钮时 文本会自动变灰 但图像保持不变 当按钮被禁用时是否可以使图像变暗而不需要两个单独的图像 在您的代码中 您还可以使用彩色滤光片 http developer android
  • 覆盖乔达一周的第一天?

    是否有可能覆盖乔达弱的第一天sunday 因为 Joda 使用Monday作为一周的第一天 如果有办法的话 谁能解释一下 我在 SOF 中提到了以下主题 乔达时间 一周的第一天 https stackoverflow com questio
  • RecyclerView onClick notificationItemRemoved 不会触发 onBindView

    I use notifyItemRemoved 方法我想更改其他剩余项目 但该方法没有触发onBindView 方法 除了使用notifyDataSetChanged 我想要附带的动画notifyItemRemoved method 如果您
  • 如何更改Android软键盘中任意键的按键背景

    我想让键盘上的一些键与其他键不同 例如下图中的shift 删除 空格键 根据google的参考文档 我们可以通过使用 来改变按键的背景android keybackground drawable xxx in input xml 但它改变了
  • Android 上的 Facebook 社交插件

    我想集成 Facebook 的评论社交插件 https developers facebook com docs reference plugins comments https developers facebook com docs r
  • 在Android项目中引用(纯java)项目(找不到类)

    我试图在我的 Android 项目中引用一个纯 java 项目 gt Java 项目有一大堆我需要使用的类 哦 正如第一个回复所指出的 我正在使用 eclipse 是的 唯一的问题是 我总是找不到类 XXX 从方法 com example
  • java.lang.IllegalStateException:FragmentManager 已被销毁

    活动中onResume我称之为 volley request 的方法 它获取项目列表 然后将它们加载到此活动内的 ListFragment 中 当我第一次进入活动时 一切正常 但当我重新进入活动时 ListFragment 为空 并且控制台
  • Android 中应用程序在后台运行时如何显示闪屏?

    我的应用程序有一个启动屏幕 无法避免它 因为这是出于品牌原因 我想屏蔽用户界面并在后台显示启动屏幕 就像银行应用程序那样 我应该覆盖 MainActivity 中视图的 onPause 和 onResume 吗 显现
  • Android动态功能模块,找不到资源

    当下载的功能模块发布到 Play 商店时 我在启动活动时遇到问题 它总是在下载模块活动中的 setContentView 上崩溃 java lang RuntimeException Unable to start activity Com
  • Android NDK - 仅用 C/C++ 编写

    有没有一种可能的方法可以使用 C C 编写整个 NDK 应用程序 而无需像 hello jni 示例项目 HelloJni java 中那样的 Java 入门 类 以某种方式创建一个 HelloJni c 来执行相同的操作 从 Androi

随机推荐

  • 将应用程序部署到谷歌应用程序引擎并想要启动api和客户端

    按照本教程在 Google 云平台上获取 api 和客户端 https www freecodecamp org news create a react frontend a node express backend and connect
  • 是否可以将泛型类型作为泛型参数传递?

    只需传递泛型类型即可callback type FUNC
  • JavaScript 字符串操作

    我有一个像下面这样的字符串 var st ROAM Synergy 111 222 LLX 它可以有任何没有 数值之前的术语 ie其可能的格式有 var st SSI ROAM Synergy 111 222 LLX or var st L
  • “尺寸未实施”是什么意思?

    我写了以下代码 use std io IoResult Writer use std io stdio fn main let h w mut Writer gt IoResult lt gt writeln w foo let h han
  • 使用 Mongoose 返回更新后的集合

    我使用nodejs express mongoose angularjs 我想更新一个名为 Lists 的集合 它具有多个属性 其中之一是项目数组 在下面的代码中 我在 items 数组中推送一个新的任务项 一切正常 但是更新函数不会发回更
  • Java - 编辑现有的 JSON 文件

    嘿 我想知道是否可以编辑现有的 json 我知道位置 假设位置是 C Something json 那我该如何编辑呢 Thanks 如果你想编辑复杂的 JSON 结构 我建议使用GSON https code google com p go
  • jquery 使用绑定与点击

    我遇到过几种在 jquery 中处理点击事件的方法 bind mydiv bind click function click mydiv click function on mydiv on click function 两个问题 他们还有
  • Stripe Checkout https://checkout.stripe.com/checkout.js 和 Elements https://js.stripe.com/v3/ 之间的区别

    我正在使用条纹支付与我的系统集成 但我不明白这两个库之间的区别 似乎使用 javascript 生成表单并将令牌传递到我们的服务器端
  • 为什么全局描述符表的第一个段描述符仅包含零?

    在我见过的许多教程中 第一个段选择器仅包含零 后面是代码和数据段 例如 lgdt gdt descriptor More code gdt start gdt null long 0x0 long 0x0 More descriptors
  • Angular 2 RC4 中的形式

    我正在尝试 Angular 2 RC4 中的表单 一切正常 但是当我启动应用程序时 浏览器控制台向我显示以下消息 It looks like you re using the old forms module This will be op
  • Gradle:复制子项目资源

    我有一个项目 其中包含一些我正在使用 Gradle 的子项目 我想做的是将资源从子项目A复制到主子项目B 我的结构看起来像这样 Application subprojectA src main resources blah subproje
  • 如果没有连接,Android WebView 不会加载缓存的网站

    我正在尝试缓存 WebView 中加载的网站 但如果网络连接关闭 我将无法使其工作 Cachdirectory 已创建 缓存文件就在那里 已授予权限 我加载网页然后关闭网络 也给出了 WI FI 权限 当我尝试重新加载页面时出现错误 现在应
  • 填充中的排序不起作用(猫鼬)

    我的MongoDB版本是3 2 mongoose版本是4 6 0 这些是我的架构 chat const chatSchema new mongoose Schema users type mongoose Schema Types Obje
  • 在 DirectX 中显示视频

    在使用 XAudio2 和 Direct3D9 10 的应用程序中显示视频 带声音 的最佳 最简单方法是什么 至少它需要能够传输可能更大的视频 并考虑到窗口宽高比可能与视频不同的事实 例如通过添加信箱 尽管理想情况下我希望能够将视频嵌入到3
  • Macroable.php 第 74 行中的 BadMethodCallException:方法控制器不存在

    当我遵循路线控制器时 我遇到了一些问题 Web php代码 Route controller admin adminController adminController php代码
  • VS Code Python 等待调试器连接超时

    昨天 在 Visual Studio Code 自我更新 从 1 27 2 到 1 28 2 之前 我可以在激活特定环境并调试脚本后从 anaconda 提示符中打开它 现在 当我尝试调试脚本时 收到有关等待调试器连接超时的错误 我遵循了另
  • 如何使 DIV 部分可点击?

    我编写了一个网页 其中的链接都包含在它们自己的标签中 我还使用 CSS 边框 背景颜色 填充 将它们设置为所有按钮样式 如何让整个 DIV 被点击来激活链接 实现这种效果 使链接像按钮一样 的最佳方法是将 css 应用到链接本身 这是一个基
  • 回收位图异常

    我收到这个异常 异常 java lang IllegalStateException 无法复制回收的位图 我的代码是 int width bitmap getWidth int height bitmap getHeight int new
  • 如何在子测试中访问 Jest 测试环境的类属性?

    我已经为jest创建了一个测试环境 它非常接近于他们的官方文档 https jestjs io docs en configuration testenvironment string 我在构造函数中设置了一些值 我希望将它们提供给环境中使
  • Android 跳过 WebView 焦点并使用 TalkBack 直接进入内容

    我的 Android 应用程序中有一个 WebView 但启用 TalkBack 后 它会聚焦于整个视图 用户必须滑动到下一个项目才能开始听到 WebView 内容 有没有办法跳过WebView的选择并直接跳到选择内容 在尝试之后我不这么认