2

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()做的伎俩,但似乎这个管理器用于其他控件,所以这不是一个好的选择。文档中说

    如果多个 IFocusManagerContainer 同时可见,则 SystemManager 会激活和停用 FocusManager。

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

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

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

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

4

1 回答 1

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

于 2013-04-26T13:27:04.303 回答