Как сбросить текущий индекс вкладки во Flash? - PullRequest
1 голос
/ 29 ноября 2010

Например, если у меня есть упорядоченный набор объектов [a, b, c, d, e] с правильно назначенным свойством tabIndex, и фокус в настоящее время находится на объекте c, я хочу изменить фокус так, чтобы:

а) Ничто не сфокусировано;

б) При следующем нажатии клавиши Tab объект a будет сфокусирован.

stage.focus = null решает (a), однако запоминает текущий индекс, вызывающий фокусировку объекта d при нажатии клавиши Tab.

Ответы [ 4 ]

1 голос
/ 29 ноября 2010

Вместо того, чтобы пытаться изменить индекс, вы можете переключить свойство tabEnabled оставшихся объектов на false, когда фокус находится на первом объекте, включите его снова.

Этот пример не структурирован в функциях, это просто демонстрационный код, чтобы уточнить, что я имею в виду

    var objects:Array = [a , b , c , d , e];

    //set a KeyboardEvent listener &
    //increment the currentIndex value when TAB is pressed
    var currentIndex:int = -1;

    //when you need to reset , disable tabEnabled property
    //for remaining objects & reset the currentIndex
    for( var i:int ; i < objects.length ; ++i )
         if( i > currentIndex )
           objects[i].tabEnabled = false;
    currentIndex = -1;
    stage.focus = null;

Нажмите вкладку еще раз, фокус на

     //enable objects
    for( var i:int ; i < objects.length ; ++i )
           objects[i].tabEnabled = true;
0 голосов
/ 12 июля 2016

Это решение не требует изменения tabIndex элементов в цикле табуляции.

Затем добавьте следующий код в ваш проект:

import flash.events.FocusEvent;

var tab_resetter:MovieClip = new MovieClip();
tab_resetter.tabIndex = 9999;
tab_resetter.addEventListener( FocusEvent.FOCUS_OUT, function() {
    stage.removeChild( tab_resetter );
});

function resetTabIndex():void {
    stage.addChild( tab_resetter );
    stage.focus = tab_resetter;
}

Поскольку tab_resetter нена сцене большую часть времени, это не будет частью обычного цикла табуляции.После вызова resetTabIndex(), tab_resetter вставляется в цикл табуляции и получает фокус.Если вы дадите tab_resetter достаточно высокое значение tabIndex, то после вызова resetTabIndex() попадание на вкладку даст фокус первому элементу в цикле вкладки.

0 голосов
/ 29 ноября 2010

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

// you should change the wildcard datatype to match your UI elements
var currentFocus:*;
var lastFocus:*;

btn.addEventListener(MouseEvent.CLICK, onClick);
function onClick(evt:MouseEvent):void{

    // store the element currently in focus
    // so that we can re-select it next time tab is hit
    lastFocus = currentFocus;
    // setting stage.focus = null will lost keyboard focus
    // so we set it to stage
    stage.focus=stage
}

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyReleased);
function onKeyReleased(evt:KeyboardEvent):void{

    if (evt.keyCode == Keyboard.TAB){

    // if lastFocus exists, set the stage focus accordingly
    // update currentFocus and then set lastFocus to null
      if (lastFocus){
        stage.focus = lastFocus;
        currentFocus = lastFocus;
        lastFocus = null;
      } else {
        // keep track of current focus
        currentFocus = stage.focus;
      }
    }
}
0 голосов
/ 29 ноября 2010

самый простой способ imho - установить фокус на e, а затем на null

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...