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 をアクティブ化および非アクティブ化します。

    しかし、このサンプル アプリには 2 つの TextInputs があり、最初の focusManager を非アクティブ化すると、2 つ目は alt-tab にフォーカスが戻りません。

  3. フォーカスを別のものに設定することはできますが、特別な「ダミー」入力を作成することは、ある種のモンキー パッチであり、避けられなくなるまで使用を避けることを好みます。

  4. TextInput の親に設定stage.focusしても効果はありません。

    それで、ウィンドウにフォーカスがないときにコンポーネントからフォーカスを削除するより良い方法を知っていますか?

4

1 に答える 1

4

わかりました、私は私を満足させる解決策を見つけました:

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

将来の SDK リリースで変更される可能性がある mx_internal 名前空間プロパティを使用するため、完全ではありません。

このソリューションは、Windows のアクティブ化時に FocusManager によってフォーカスが復元されるため機能します (コメントアウトされた行を含む素敵なコード...):

    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 に答える