Как изменить порядок вкладок во Flex (Actionscript, SDK 3.5) - PullRequest
5 голосов
/ 13 декабря 2010

Порядок гибких вкладок важен как для удобства использования (очевидно), так и для доступности (он определяет порядок чтения чтения с экрана). Однако 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 самого высокого уровня, так как часто у вас нет доступа к внутренней работе используемых вами компонентов.

* 1 028 * Пример:

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, например, на переключатели One и Three по тем причинам, по которым мы могли бы это сделать)

Фактический результат: порядок вкладок горизонтальный, то есть переход между двумя формами ввода. TopLevelElement (без указанного tabIndex) является последним в порядке табуляции.

Изменение вложенности контейнеров не будет работать в модульных проектах, а изменение порядка дочерних элементов повлияет на их позицию отображения (тогда как переход к контейнеру Canvas приводит к потере AutoLayout).

Есть ли способ (возможно, сложный, но желательно не переписывающий SDK) указать порядок вкладок для отдельных компонентов, независимо от других компонентов?

Если все остальное не поможет, поможет ли обновление до Flex4 решить эту проблему?

Ответы [ 2 ]

7 голосов
/ 14 декабря 2010

после небольшого исследования я обнаружил следующее:

  • если (даже один) DisplayObject имеет tabIndex > 0, это означает, что теперь нажатие TAB будет переключать фокус только между экземплярами с tabIndex > 0
  • если есть только один экземпляр с tabIndex > 0, он будет фокусироваться вечно
  • если current.tabIndex - next.tabIndex > 1 это не имеет значения, tabIndex увеличится до следующего существующего значения
  • если несколько экземпляров имеют одинаковые значения tabIndex, они получат фокус в собственном порядке (как будто tabIndex никогда не определяется)
    -------------------------------------------------- -----------------------------

    так:

  • для настройки навигации по TAB между некоторыми объектами DisplayObject (независимо от того, где они находятся в списке отображения) - просто установите tabIndex > 0 для каждого из них.

  • для удаления экземпляра из списка TAB - установите tabIndex = 0 (но если в приложении остались только объекты DisplayObject с tabIndex == 0 - TAB естественным образом переключит фокус между ними). tabEnabled = false должен быть лучшим выбором
  • для создания нескольких групп объектов DisplayObject с естественным порядком TAB внутри каждой из них при сохранении определенного порядка между группами - выберите один tabIndex для каждой группы (сначала появляются небольшие значения) и примените выбранный tabIndex к каждому члену группы.

    я думаю, что слишком много экземпляров в списке TAB бесполезны и раздражают, поэтому лучший способ справиться с этим - сделать его равным списку лучших, например. 10 самых полезных элементов интерфейса для текущего состояния приложения.

и немного кода (на вашем примере):
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; нуль, 3; 0, ноль, 1 (ноль == 0 для tabIndex) - фокус появится в правом нижнем углу, затем в верхнем левом и, наконец, в центре.
надеюсь, что это будет полезно

1 голос
/ 17 августа 2011

Я думаю, что некоторая информация, которую дает www0z0k, более не точна (или, может быть, никогда не была?). Просто прочитайте Flex Docs в свойстве tabIndex:

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/InteractiveObject.html#tabIndex

Определяет порядок вкладок объектов в SWF-файле.Свойство tabIndex по умолчанию равно -1, что означает, что для объекта не задан индекс вкладки.

Если какой-либо отображаемый в данный момент объект в SWF-файле содержит свойство tabIndex, автоматическое упорядочение вкладок отключено, а упорядочение вкладок равнорассчитывается из свойств tabIndex объектов в SWF-файле.Настраиваемый порядок вкладок включает только объекты со свойствами tabIndex.

Свойство tabIndex может быть неотрицательным целым числом.Объекты упорядочены в соответствии с их свойствами tabIndex в порядке возрастания.Объект со значением tabIndex, равным 1, предшествует объекту со значением tabIndex, равным 2. Не используйте одно и то же значение tabIndex для нескольких объектов.

Порядок пользовательских вкладок, определяемый свойством tabIndex, является плоским.Это означает, что не уделяется внимания иерархическим отношениям объектов в SWF-файле.Все объекты в SWF-файле со свойствами tabIndex размещаются в порядке вкладок, а порядок вкладок определяется порядком значений tabIndex.

Редактировать : По моему опытув Flex 3.3.0 утверждения № 1 и № 2, сделанные www0z0k, неверны.Для # 1 элементы управления, для которых вы явно не устанавливаете tabIndex, будут всегда падать раньше, чем все элементы управления, которым вы присваиваете положительные числа в порядке табуляции.Для # 2 из этого следует, и можно заметить, что если вы установите только один tabIndex, этот один элемент управления будет просто следовать всем другим автоматическим элементам управления в порядке вкладок.

...