tabStop容器焦点停留与走焦规则
tabStop 是专门用于容器组件的属性。它的作用是:让焦点可以 “停在容器本身”,而不是直接穿透进子组件。
只有设置了 tabStop(true) 的容器,才能成为焦点停留节点,实现 “先选中容器 → 再进入内部” 的分层走焦逻辑。
tabStop 只对容器生效,且容器内必须有可获焦子组件。
容器设置 tabStop 后,requestFocus() 可让焦点停留在容器上。
tabStop 容器嵌套不能超过 2 层。
不建议根容器设置 tabStop,会导致 Enter / ESC 逻辑异常。
按键行为:
Tab / 方向键:
焦点只会停在配置 tabStop 的容器上;在容器内部时,可在子可焦组件间游走;走到末尾自动跳出容器,切换到外部下一个容器。
Enter 键:
焦点停在容器外层 → 按 Enter,直接切入容器内部第一个可获焦子组件。
ESC 键:
焦点在子组件 → 按 ESC,退回上一层带 tabStop 的容器,最高不超出当前页面根容器。
空格键:
焦点停在 tabStop 容器上时,可直接触发容器的 onClick 点击事件。
对于以下节点结构
┌────────────────────────────┐
│ PageRoot 根容器(不配置 tabStop) │
└────────────────────────────┘
┌─────────────────────┐
│ 容器A tabStop=true │
├─────────────────────┤
│ 子按钮 A1 │
│ 子按钮 A2 │
└─────────────────────┘
┌─────────────────────┐
│ 容器B tabStop=true │
├─────────────────────┤
│ 子按钮 B1 │
└─────────────────────┘
┌─────────────────────┐
│ 容器C 无 tabStop │
├─────────────────────┤
│ 子按钮 C1 │
└─────────────────────┘
焦点走向:
-
Tab / 方向键 → 停靠容器外层
外部普通节点
↓ Tab/方向键
┌─────────────────────┐
│ 容器A tabStop=true │
└─────────────────────┘
焦点停在容器本身,不自动进到 A1/A2 -
按下 Enter → 切入内部首个子组件
┌─────────────────────┐
│ 容器A 焦点停靠中 │
└─────────────────────┘
↓ Enter
┌─────────────────────┐
│ 子按钮 A1(可焦) │
└─────────────────────┘ -
内部走完 → 自动跳出容器
A1 → A2 连续走焦,到末尾再按 Tab / 方向键:自动离开容器 A,跳转到下一个 tabStop 容器 B。 -
按下 ESC → 退回上层停靠容器
┌─────────────────────┐
│ 子按钮 A1 / A2 │
└─────────────────────┘
↓ ESC
┌─────────────────────┐
│ 容器A tabStop=true │
└─────────────────────┘ -
无 tabStop 容器:直接穿透不停留
外部普通节点
↓ 走焦
┌─────────────────────┐
│ 容器C 无 tabStop │
└─────────────────────┘
↓ 直接穿透
┌─────────────────────┐
│ 子按钮 C1(可焦) │
└─────────────────────┘
容器 C 无法留住焦点,焦点直接落到子按钮
通过 requestFocus 请求焦点:
如果是容器组件 + 配置 tabStop=true:焦点能稳稳停在容器本体上;
如果容器没配 tabStop:哪怕整条页面焦点链里、别的地方有无数 tabStop 容器,这个无 tabStop 的容器,照样能直接拿到焦点、穿透下去。
场景结构:
执行 requestFocus(容器C)
↓
┌─────────────────────┐
│ 容器C 无 tabStop │ ← 无视全局tabStop,直接抢占焦点链路
└─────────────────────┘
↓ 自动穿透
┌─────────────────────┐
│ 焦点落到子按钮 C1 │
└─────────────────────┘
更多推荐

所有评论(0)