2013-04-26 99 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激活。