2013-04-26 98 views
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()会诀窍,但它似乎是这个经理用于其他控制,所以这不是一个好的选择。这是

    则SystemManager将激活和取消激活FocusManager,然后如果有更多 多个IFocusManagerContainer是在同一时间可见的文档中说。

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

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

  4. 设置stage.focus给TextInput的某些父项也没有任何影响。

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

回答

4

好吧,我发现,我满意的解决方案:

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

因为它使用它可以在未来的SDK版本中改变mx_internal命名空间属性它并不完美。

此解决方案,因为重点是恢复的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激活。