HarmonyOS 鸿蒙Next中屏幕朗读适配存在底层焦点的场景
HarmonyOS 鸿蒙Next中屏幕朗读适配存在底层焦点的场景
- 定义:应用通过Stack布局或者类模态的方式把显示视图覆盖在原来的页面之上,仍可使用触摸或扫动方式聚焦原来页面的组件,这种现象就是存在底层焦点。
- 示例 在屏幕朗读适配过程中,存在这种场景,在页面A拉起半模态页面B,在半模态页面上进行焦点走读过程,因为页面存在底层页面,导致在走焦过程中,焦点会回到页面A,这种场景不满足当前屏幕朗读适配场景,需要进行修复;
要修复这个问题,就要了解下accessibilityLevel。
accessibilityLevel
accessibilityLevel(value: string)
无障碍重要性。
系统能力: SystemCapability.ArkUI.ArkUI.Full
参数:

修改方式:Stack布局或者类模态覆盖在原来的页面之上,应用可以通过设置底层页面根节点的accessibilityLevel为no-hide-descendants,Stack布局或者类模态关闭后accessibilityLevel再恢复成auto; 如果是完全覆盖,应用也可以设置底层页面根节点的visibility属性为None,Stack关闭后visibility再设置成Visible。
图示:

1为底层界面的根节点,2为拉起的半模态页面。
更多关于HarmonyOS 鸿蒙Next中屏幕朗读适配存在底层焦点的场景的实战教程也可以访问 https://www.itying.com/category-93-b0.html
学到了,感谢楼主分享
更多关于HarmonyOS 鸿蒙Next中屏幕朗读适配存在底层焦点的场景的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
👍,
在HarmonyOS Next中,屏幕朗读适配底层焦点场景时,需确保所有可交互控件都正确设置了无障碍焦点属性。开发者应使用accessibilityConfig为组件配置accessibilityText和focusable属性,确保焦点能按逻辑顺序移动。对于自定义组件,需通过accessibilityGroup管理焦点组,并使用accessibilityDelegate处理焦点事件。系统会自动处理部分原生控件的焦点,但复杂场景需手动调整焦点顺序和范围。
在HarmonyOS Next中,您描述的“底层焦点”问题确实是屏幕朗读(TalkBack)适配中的一个关键场景。您对问题的定义和示例非常准确。
针对此问题,您提出的解决方案方向是正确的。核心在于通过accessibilityLevel属性控制组件树对无障碍服务的暴露方式。
具体分析与操作建议:
-
问题根因:当半模态页面(如
Sheet、Modal等)或Stack布局覆盖在底层页面上时,虽然视觉上底层被遮挡,但其组件节点在无障碍树中默认仍然可见且可聚焦(accessibilityLevel默认为auto)。这导致屏幕朗读焦点会在顶层和底层组件间跳跃,造成逻辑混乱。 -
推荐解决方案:您提到的设置底层页面根节点
accessibilityLevel为no-hide-descendants是最佳实践。- 原理:
no-hide-descendants会强制让无障碍服务忽略该节点及其所有子节点,即使它们视觉上未被完全覆盖或设置了visibility。这从根本上切断了底层页面组件被屏幕朗读发现和聚焦的路径。 - 操作:
- 在半模态页面显示时,将底层页面根容器(如
Column、Stack)的.accessibilityLevel('no-hide-descendants')设置为。 - 在半模态页面关闭时,将底层页面根容器的
.accessibilityLevel('auto')恢复为。
- 在半模态页面显示时,将底层页面根容器(如
- 原理:
-
备选方案:您提到的设置
visibility为None也是一种方法,但其副作用更大(会触发完整的布局重计算和渲染管线更新),可能影响性能和平滑度。通常优先推荐使用accessibilityLevel进行逻辑隐藏。 -
关键提醒:
- 作用域:务必在底层页面的根节点上设置,以确保其整个子树被屏蔽。
- 状态管理:需要与半模态页面的显示/隐藏状态严格同步,确保
accessibilityLevel值在正确时机切换,避免底层页面在恢复后仍无法被朗读。 - 测试验证:修复后,务必在真机上开启屏幕朗读功能,通过触摸探索和滑动手势完整遍历焦点,确认焦点被完全限制在顶层半模态页面内。
您提供的图示清晰地展示了应修改的节点(底层界面根节点1),实践时遵循此路径即可有效解决底层焦点干扰问题。

