Apache flex 如何在Flex中更改选项卡顺序(Actionscript,SDK 3.5)

Apache flex 如何在Flex中更改选项卡顺序(Actionscript,SDK 3.5),apache-flex,flash,actionscript-3,tab-ordering,Apache Flex,Flash,Actionscript 3,Tab Ordering,flex选项卡顺序对于可用性(显而易见)和可访问性(它定义了屏幕阅读器的阅读顺序)都很重要。然而,Flex3.5似乎几乎没有支持来影响更复杂的应用程序 据我目前所知: 选项卡顺序由mx.managers.FocusManager计算,它负责整个应用程序的一个“选项卡周期”(即不是每个容器一个,而是整个应用程序一个)。例外情况是嵌入了.swf文件和弹出窗口,每个文件和弹出窗口都有自己的FocusManager FocusManager中的逻辑被标记为私有,类在Application.initia

flex选项卡顺序对于可用性(显而易见)和可访问性(它定义了屏幕阅读器的阅读顺序)都很重要。然而,Flex3.5似乎几乎没有支持来影响更复杂的应用程序

据我目前所知:

  • 选项卡顺序由mx.managers.FocusManager计算,它负责整个应用程序的一个“选项卡周期”(即不是每个容器一个,而是整个应用程序一个)。例外情况是嵌入了.swf文件和弹出窗口,每个文件和弹出窗口都有自己的FocusManager

  • FocusManager中的逻辑被标记为私有,类在Application.initialize()中实例化,因此不容易更改行为(缺少重写SDK的部分,这可能会造成许可证问题)

  • 选项卡顺序查找每个组件tabIndex(int)属性。具有此属性集(>0)的所有组件都按其值排序,否则将使用可视层次结构(使用容器嵌套和容器内的子顺序)

  • 所有未设置tabIndex的组件都将排序在设置了tabIndex的组件之后(内部,“tabIndex未设置”映射到“tabIndex=int.MAX_值”)

  • 具有相同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>

Application.mxml

预期结果:选项卡顺序将首先是左侧的三个垂直项,然后是右侧的三个垂直项,即按容器分组。TopLevelElement是选项卡顺序中的第一个。 (如果未指定tabIndex,则其工作方式完全相同,但是,无论出于何种原因,我们都无法实际将tabIndex更改为,例如,切换1和3)

实际结果:选项卡顺序是水平的,即在两个输入表单之间跳跃。TopLevelElement(未指定tabIndex)是选项卡顺序中的最后一个

更改容器的嵌套在模块化项目中不起作用,更改子对象的顺序会影响它们的显示位置(而使用画布容器会松开自动布局)

是否有一种方法(可能很复杂,但最好不要重写SDK)来指定单个组件的选项卡顺序,而不依赖于其他组件


如果所有这些都失败了,升级到Flex4是否有助于解决此问题?

经过一番研究,我发现了以下几点:

  • 如果(即使是单个)
    DisplayObject
    具有
    tabIndex>0
    ,则意味着从现在开始,按
    TAB
    将仅在实例之间切换焦点
    tabIndex>0

  • 如果只有一个实例具有
    tabIndex>0
    ,它将永远被关注
  • 如果
    current.tabIndex-next.tabIndex>1不重要,tabIndex将增加到下一个现有值
  • 如果多个实例的tabIndex值相等,则它们将按本机顺序接收焦点(好像从未定义过tabIndex)
    -------------------------------------------------------------------------------

    因此:

  • 要在某些DisplayObjects(无论它们在显示列表中位于何处)之间设置选项卡导航,只需为它们中的每一个设置
    tabIndex>0

  • 用于从选项卡列表中删除实例-设置
    tabIndex=0
    (但如果应用程序中只剩下
    tabIndex==0
    的DisplayObjects,则选项卡将在它们之间自然切换焦点)。
    tabEnabled=false
    应该是更好的选择
  • 要创建多个显示对象组,在每个组中使用自然制表符顺序,同时在组之间保持一定的顺序,请为每个组选择一个tabIndex(首先显示较小的值),并将所选的tabIndex应用于组中的每个成员。

    我认为选项卡列表中有太多的实例是无用和烦人的,因此管理它的最佳方法应该是使其与当前应用状态的前10个最有用的UI元素列表相等。

还有一点代码(基于您的示例):
showclasses.NewFile.mxml:

<mx:VBox xmlns:mx="library://ns.adobe.com/flex/mx"
         xmlns:fx="http://ns.adobe.com/mxml/2009" data="1,2,3" creationComplete="addFocuses();">
    <fx:Script>
        <![CDATA[       
        private function addFocuses():void{
            var focs:Array = data.split(',');
            One.tabIndex = focs[0];
            Two.tabIndex = focs[1];
            Three.tabIndex = focs[2];           
        }       
        ]]>
    </fx:Script>
    <mx:Label text="One"/>
    <mx:TextInput id="One" />
    <mx:Label text="Two" />
    <mx:TextInput id="Two"/>
    <mx:Label text="Three" />
    <mx:TextInput id="Three"/>
</mx:VBox>

Main.mxml:

<mx:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    xmlns:th="showclasses.*">
    <mx:HBox>
        <th:NewFile data="1,2,3" />
        <th:NewFile data="1,2,3" />
        <th:NewFile data="1,2,3" />
    </mx:HBox>
</mx:Application>

如果数据值为1,2,3;1,2,3;1,2,3-焦点从左到右水平移动(很自然,因为每行中的tabIndex是常量),然后切换到下一行的左元素。

如果它们是2;null,3;0,null,1(对于tabIndex,null==0)-焦点将出现在右下角,然后出现在左上角,最后出现在中间。
希望这会有用

我认为www0z0k提供的一些信息不再准确(或者可能从来都不准确)。只要阅读
tabIndex
属性上的Flex文档:

指定SWF文件中对象的选项卡顺序。选项卡索引 属性默认为-1,这意味着没有为对象设置选项卡索引

如果SWF文件中当前显示的任何对象包含tabIndex 属性,则禁用自动选项卡排序,并且选项卡排序为