Как создать несколько петель вкладок в AS3 с помощью fl.managers.FocusManager? - PullRequest
2 голосов
/ 07 сентября 2010

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

  1. Официальный метод
    Я прочитал документацию Adobe от здесь , и она описывает, что я должен делать в моем случае, как это:

    «Каждый компонент модального окна содержит экземпляр FocusManager, поэтому элементы управления в этом окне становятся его собственным набором вкладок. Это предотвращает непреднамеренную навигацию пользователя по компонентам в других окнах при нажатии клавиши Tab». Но я все еще не понимаю, как использовать FocusManager.

    • Я попытался создать экземпляр FocusManager в каждом из моих классов компонентов представления, поместив приведенный ниже код в конструктор, но это не сработало:

    _focusManager = new FocusManager(this);

    • Что они понимают под "модальным компонентом окна"?
  2. Обходной метод
    Еще я попробовал вручную установить для свойства tabEnabled значение true или false для каждой кнопки и TextField, когда родительский компонент отправляет событие FOCUS_IN или FOCUS_OUT. Это сработало на простом примере, который я создал для нового флэш-файла, но он не работает в моем большом проекте, и я не знаю, как его отладить. Тем не менее, я был бы очень рад бросить это и вернуться к методу № 1.

Кто-нибудь сталкивался с этими проблемами раньше? Вы использовали несколько циклов табуляции каким-либо другим способом? Любые намеки приветствуются сейчас, потому что я трачу слишком много времени на эту проблему. Спасибо [Изменить] Я получил много просмотров по этому вопросу, но не получил соответствующих ответов, поэтому я отредактировал его и попытался упростить его

Ответы [ 3 ]

1 голос
/ 14 сентября 2013

Да, таббирование может быть настоящей болью.

У меня была похожая проблема, когда вкладки перестали работать после открытия всплывающего окна. Проблема заключалась в том, что всплывающее окно было живым на заднем плане и угнало вкладку.

Это решило мою проблему с отдельными табло, теперь работающими для основного приложения и всплывающих окон:

// my popupclass

protected var fm:FocusManager;


public function show( centered:Boolean = true, parent:DisplayObject = null, modal:Boolean = true ):void {

// some code    
   fm = new FocusManager( this );
   fm.activate();

}

public function hide( closeType:int = 1 ):void {

   // more code
   fm.deactivate();

}
0 голосов
/ 14 октября 2010

В итоге я написал свой собственный FocusManager, который делает то, что мне нужно.Это оказалось проще, чем я думал.Мне жаль говорить, что я не могу опубликовать код здесь, но я дам вам краткое описание того, что я сделал, и надеюсь, что это поможет:

  • Я реализовал fl.managers.IFocusManager интерфейс, но я не совсем уважал способ работы старого менеджера
  • Конструктор моего CustomFocusManager требует массив дочерних элементов с вкладками в качестве параметра, и дочерние элементы должны бытьв том порядке, в котором они появятся в цикле.Таким образом, мне не нужно было заботиться о типе детей (табуляция или нет?) Или спрашивать себя, существуют ли tabIndexes или нет.
  • Я игнорировал свойства tabIndex
  • Я создал новый интерфейс с именем IFocusManagerContainer , созданный на основе интерфейса Flex с тем же именем
  • Я создал статический класс, похожий на Flex SystemManager, который знает, когда активировать / деактивировать FocusManager в зависимости от детей, найденных на сцене.

Я взглянул на mx.managers.FocusManager , и, как я видел, большая часть их усилий была направлена ​​на обработку всех возможных случаев, когда может использоваться FocusManager, поэтому он такой длинный и сложный.Я могу только предположить, что fl.managers.FocusManagers выглядит аналогично.Могу поспорить, что у меня все еще много проблем, и он не такой переносимый, как у Adobe, но он очень прост и делает то, что мне нужно.

Я все еще хотел бы увидеть некоторые рекомендации о том, как правильно использовать существующий FocusManager.

0 голосов
/ 14 сентября 2010

В зависимости от того, чего вы пытаетесь достичь, вы можете использовать tabIndex вместо FocusManager.

http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/display/InteractiveObject.html#tabIndex

...