当窗口没有焦点时如何从控制中移除焦点?(否则当窗口再次获得焦点时它将被恢复)

时间:2013-04-26 12:24:10

标签: actionscript-3 flex air focusmanager

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不起作用 - 当窗口没有焦点时,stage.focus已经null,因此无效。

  2. input.focusManager.deativate()可以解决问题,但似乎这个管理器用于其他控件,所以这不是一个好选择。在文档中说

      

    如果更多,SystemManager将激活和取消激活FocusManager   只有一个IFocusManagerContainer可以同时显示。

    但是在这个示例应用程序中我有两个TextInputs,当我为第一个停用focusManager时,第二个不再将焦点恢复到alt-tab上。

  3. 我可以将焦点设置为其他东西,但创建特殊的“虚拟”输入是某种猴子补丁,我宁愿避免使用它,直到它不可避免。

  4. stage.focus设置为TextInput的某个父级也没有任何效果。

    那么,你知道在窗口没有焦点的情况下从组件中移除焦点的更好方法吗?

1 个答案:

答案 0 :(得分:4)

好的,我找到了满足我的解决方案:

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激活的关注。