Как удалить фокус из управления, когда у окна нет фокуса? (Иначе он будет восстановлен, когда окно снова получит фокус)

Мне нужно убрать фокус с TextInput, пока окно Adobe Air не имеет фокуса. Но я не могу найти нормального способа сделать это.

Вот пример приложения:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/mx"

                       >
    <fx:Script>
        <![CDATA[
            protected function onFocusIn(event:FocusEvent):void{
                input.appendText('I');
            }

            protected function onFocusOut(event:FocusEvent):void{
                input.appendText('o');
            //  input.focusManager.deactivate();
            //  stage.focus = null;  
            //  focusManager.setFocus(input2);
            //  stage.focus = stage; 
            }

        ]]>
    </fx:Script>
    <s:VGroup>      
        <s:TextInput id="input" focusIn="onFocusIn(event)" focusOut="onFocusOut(event)" />
        <s:TextInput id="input2" /> 
    </s:VGroup>

  1. stage.focus = null does not work - stage.focus is already null when window does not have focus, so it does not work.

  2. # P3 #
    # P4 #
    # P5 #
  3. Я могу переключить фокус на что-то другое, но создание специального «фиктивного» ввода - это своего рода обезьяний патч, и я предпочитаю избегать его использования до тех пор, пока это не станет неизбежным.

  4. Установка stage.focus для какого-либо родителя TextInput также не имеет никакого эффекта.

    Итак, знаете ли вы лучший способ снять фокус с компонента, когда у окна нет фокуса?


person user1875642    schedule 26.04.2013    source источник


Ответы (1)


Хорошо, я нашел решение, которое меня устраивает:

FocusManager(focusManager).mx_internal::lastFocus = null;

Он не идеален, поскольку использует свойство пространства имен mx_internal, которое может быть изменено в будущих выпусках sdk.

Это решение работает, потому что FocusManager восстанавливает фокус при активации Windows (хороший код с закомментированными строками ...):

    private function activateWindowHandler(event:Event):void
    {
//        var target:InteractiveObject = InteractiveObject(event.target);
        // trace("FM " + this + " activateWindowHandler ", _lastFocus);

        windowActivated = true;

        if (activated)
        {
            dispatchEvent(new FlexEvent(FlexEvent.FLEX_WINDOW_ACTIVATE));
            // restore focus if this focus manager had last focus
            if (_lastFocus && !browserMode)
                _lastFocus.setFocus();
            lastAction = "ACTIVATE";
        }
    }

К сожалению, он не является частью трассировки стека обработчика focusIn, поэтому потребовалось время, чтобы выяснить, кто восстанавливает фокус при активации Windows.

person user1875642    schedule 26.04.2013