2

問題: XML 構成ファイルは、実行時にロードされ、アプリケーションの createChildren() が呼び出されたときに準備ができている必要があります。遅くとも、子コンポーネントを適切に初期化するには構成値が必要なためです。できれば、アプリケーションが作成される前に構成の読み込みを完了させたいと思います。要するに、私はこれをしたい:

  1. 構成をロードしてから
  2. ロードされた構成を使用してアプリケーションを初期化します。

これを解決するために、カスタム プリローダーを作成しました。しかし、アプリケーションの createChildren() メソッドは、構成がまだロードされることが保証されていないプリロード中にすでに呼び出されています。つまり、カスタム プリローダーが COMPLETE イベントを送出する前です。

事前に助けてくれてありがとう。

4

2 に答える 2

3

私はその問題の解決策を見つけました。重要なのは、プリローダーのFlexEvent.INIT_PROGRESSイベントをキャッチしてキューに入れ、構成が完全にロードされるまでその伝播を停止することでした。これにより、フレームワークが効果的に停止し、アプリケーションの初期化が続行されます。構成がロードされたら、キューに入れられたイベントを再ディスパッチして、フレームワークにプリロードフェーズを終了させます。以下のサンプルコード(関連する部分のみ):

public class PreloaderDisplay extends Sprite implements IPreloaderDisplay {
    // mx.preloaders.IPreloaderDisplay interface
    public function set preloader(preloader:Sprite):void {
        // max priority to ensure we catch this event first
        preloader.addEventListener(FlexEvent.INIT_PROGRESS, onInitProgress, false, int.MAX_VALUE);
        startLoadingConfiguration();
    }
    private function onInitProgress(e:FlexEvent):void {
        if (isConfigurationLoading) {
            queuePreloaderEvent(e);
            e.stopImmediatePropagation();
        }
    }
    private function onConfigurationLoaded():void {
        dispatchQueuedPreloaderEvents();
    }
}

アプリケーションで使用するには:

<mx:Application preloader="the.package.of.PreloaderDisplay">
于 2010-05-07T12:40:42.053 に答える
1

最も簡単な方法 (私が思うに) は、コンテキスト ファイルが読み込まれた後にアプリケーションのコンテンツを作成する「ホルダー」キャンバスを作成することです。

(疑似コード)

アプリケーション.mxml:

<mx:Canvas>
   <mx:Script>
      public function init():void{
          loadXML();
      }

      public function handleXMLLoaded():void{
          this.addChild(myApplicationContent);
      }
   </mx:Script>
</mx:Canvas>

MyApplicationContent.mxml

<mx:Canvas>
<!-- contains all your components etc -->
</mx:Canvas>
于 2010-05-05T13:46:17.080 に答える