Roku是否内置焦点管理系统?焦点导航异常问题咨询
Roku 焦点机制核心说明与问题解决
一、Scenegraph 焦点管理核心逻辑
- Roku 的焦点导航依赖容器组件的内置遍历规则,仅部分官方容器(如
GroupList、GridLayout、VerticalLayout)自带完整焦点切换能力,普通Group不会自动处理上下/左右焦点跳转。 - 焦点激活规则:
initialFocus仅标记默认焦点候选,必须通过调用m.top.setFocus(true)才能触发焦点的实际挂载,这是Scenegraph的强制要求,并非异常。
二、你的场景问题解决
1. 垂直组件无法互相导航
如果使用普通 Group 包裹垂直排列的 ButtonGroup 或 Button,需手动配置容器的 navigation 属性定义焦点切换关系:
<Group id="mainContainer" navigation="[ {down: buttonGroup2, up: buttonGroup1}, {down: button2, up: button1} ]"> <ButtonGroup id="buttonGroup1" /> <ButtonGroup id="buttonGroup2" translation="[0, 100]" /> </Group>
更简便的方式是直接使用**VerticalLayout**容器,它内置垂直方向的焦点自动遍历能力,无需手动配置:
<VerticalLayout id="mainLayout" spacing="20"> <ButtonGroup id="buttonGroup1" /> <ButtonGroup id="buttonGroup2" /> </VerticalLayout>
2. 焦点初始化失效问题
- 确保
initialFocus指向的组件是当前容器的直接子元素,或属于可被容器遍历到的层级。 - 在组件初始化完成后(如
init()方法末尾)调用m.top.setFocus(true),确保焦点被正确激活:
sub init() m.top.initialFocus = m.top.buttonGroup1 m.top.setFocus(true) end sub
三、避免自定义焦点管理的最佳实践
- 优先使用Roku官方布局容器:
VerticalLayout、HorizontalLayout、GridLayout、GroupList,这些容器均内置对应方向的焦点自动导航逻辑。 - 若需自定义容器,可继承
LayoutGroup,通过其navigation属性批量配置焦点规则,无需从零实现完整的焦点遍历系统。
内容的提问来源于stack exchange,提问作者Bart
相关产品推荐
相关产品推荐

