flex 选项卡的顺序对于可用性(显而易见)和可访问性(它定义了屏幕阅读器的阅读顺序)都很重要。然而,Flex 3.5 似乎几乎没有支持影响它以适应更复杂的应用程序。
据我目前所知:
选项卡排序由 mx.managers.FocusManager 计算,它负责整个应用程序的一个“选项卡循环”(即,不是每个容器都有一个,而是整个应用程序都有一个)。嵌入的 .swf 文件和弹出窗口是个例外,它们都有自己的 FocusManager。
FocusManager 内部的逻辑被标记为私有,并且类在 Application.initialize() 中实例化,因此很难改变行为(缺少重写部分 SDK,可能会造成许可证问题)
制表符排序查找每个组件的 tabIndex (int) 属性。所有具有此属性集 (>0) 的组件都按其值排序,否则使用视觉层次结构(使用容器嵌套和容器内的子顺序)。
所有没有 tabIndex 的组件都被排序在设置它的组件之后(在内部,“tabIndex not set”映射到“tabIndex = int.MAX_VALUE)
具有相同 tabIndex 的两个组件按视觉层次结构排序。
这意味着您可以使用视觉层次结构的自动排序(主要是您想要的),或者您可以直接使用指定 tabIndexes - 但是如果您这样做,您会完全搞砸自动排序。如果您使用自定义组件并想要更改其中的选项卡顺序,这尤其糟糕:一旦您这样做,您就破坏了使用您的组件的所有屏幕的选项卡顺序。此外,您不能只在最高级别的 mxml 文件上设置选项卡顺序,因为您通常无权访问您使用的组件的内部工作。
例子:
accVerticalStuff.mxml
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Label text="One"/>
<mx:TextInput tabIndex="1" id="One" />
<mx:Label text="Two" />
<mx:TextInput tabIndex="2" id="Two"/>
<mx:Label text="Three" />
<mx:TextInput tabIndex="3" id="Three"/>
</mx:VBox>
应用程序.mxml
预期结果:标签顺序将首先是左侧的三个垂直项目,然后是右侧的三个垂直项目,即按容器分组。TopLevelElement 是 Tab 键顺序中的第一个。(如果没有指定 tabIndex,它完全以这种方式工作,但是我们无法将 tabIndex 实际更改为例如切换一和三,无论出于何种原因我们可能想要这样做)
实际结果: tab 排序是水平的,即在两个输入表单之间跳转。TopLevelElement(未指定 tabIndex)在 Tab 键顺序中位于最后。
更改容器的嵌套在模块化项目中不起作用,更改子项的顺序会影响它们的显示位置(而使用 Canvas 容器会丢失 AutoLayout)。
有没有办法(可能很复杂,但最好不要重写 SDK)来指定单个组件的制表符顺序,而不依赖于其他组件?
如果一切都失败了,升级到 Flex4 是否有助于解决这个问题?