コンテナの creationPolicy プロパティを none に設定した場合、コンテナ内で MXML タグとして宣言されているコンポーネントは生成されません。代わりに、これらのコンポーネントを記述したオブジェクトが Array に追加されます。これらのオブジェクトは記述子と呼ばれます。createComponentsFromDescriptors() メソッドを使用すると、これらのコンポーネントを手動でインスタンス化できます。このメソッドは、Container 基本クラスで定義されます。
コンテナの createComponentsFromDescriptors() メソッドを使用して、コンテナのすべての子を同時に生成することができます。
createComponentsFromDescriptors() メソッドのシグネチャは次のとおりです。
container.createComponentsFromDescriptors(recurse:Boolean):Boolean
recurse 引数は、コンポーネントの子を再帰的にインスタンス化するかどうかを指定します。コンポーネントの子をインスタンス化する場合は、このパラメータを true に、子をインスタンス化しない場合は false に設定します。デフォルト値は false です。
単一ビューコンテナで createComponentsFromDescriptors() メソッドを呼び出すと、creationPolicy プロパティの値に関係なく、そのコンテナのすべてのコントロールがインスタンス化されます。
ナビゲータコンテナで creationPolicy プロパティを all に設定すると、そのコンテナ内のすべてのビューにあるすべてのコントロールが生成されるため、createComponentsFromDescriptors() メソッドを呼び出す必要がありません。creationPolicy プロパティを none または auto に設定して createComponentsFromDescriptors() メソッドを呼び出すと、現在のビューのコントロールとその子孫だけが生成されます。
これ以外の一般的な使用法として、ナビゲータコンテナの creationPolicy プロパティを auto に設定するという方法があります。その後で、navigator.getChildAt(n).createComponentsFromDescriptors() を呼び出すと、n 番目のビューの子を明示的に生成できます。
次の例では、アプリケーションの起動時には HBox コンテナのボタンを一切インスタンス化せずに、ユーザーが creationPolicy プロパティの値を変更したときにインスタンス化します。ユーザーが、ドロップダウンリストから「すべて」を選択すると、HBox コンテナのボタンがインスタンス化されます。
<?xml version="1.0"?>
<!-- layoutPerformance/ChangePolicy.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="appInit()">
<mx:Script><![CDATA[
[Bindable]
public var p:String;
private function appInit():void {
p = policy.selectedItem.toString();
}
private function changePolicy():void {
var polType:String = policy.value.toString();
hb.creationPolicy = polType;
if (polType == "none") {
// do nothing
} else if (polType == "all") {
hb.createComponentsFromDescriptors();
}
}
]]></mx:Script>
<mx:ComboBox id="policy" close="p=String(policy.selectedItem);changePolicy();">
<mx:dataProvider>
<mx:Array>
<mx:String>none</mx:String>
<mx:String>all</mx:String>
</mx:Array>
</mx:dataProvider>
</mx:ComboBox>
<mx:Panel title="Creation Policy" id="hb" creationPolicy="none">
<mx:Button label="1" width="50" y="0" x="0"/>
<mx:Button label="2" width="50" y="0" x="75"/>
<mx:Button label="3" width="50" y="0" x="150"/>
</mx:Panel>
<mx:Label text="{p}"/>
</mx:Application>
前の例で実行する SWF ファイルは以下のとおりです。
Flex アプリケーションの起動時には、各 MXML コンポーネントを記述する Object 型のオブジェクトが 作成されます。これらのオブジェクトには、オブジェクトの MXML タグに設定されているコンポーネントの名前、タイプ、プロパティに関する情報が含まれます。Flex は、各コンテナが維持する Array にこれらのオブジェクトを追加します。例えば、2 つの Canvas コンテナを持つアプリケーションには、それらの Canvas コンテナを記述するオブジェクトを含む Array があります。そして、これらのコンテナには、その子を記述するオブジェクトを持つ Array があります。
Array に含まれる各オブジェクトのタイプは ComponentDescriptor です。この Array にアクセスするには、コンテナの childDescriptors プロパティを使用します。記述子は 0 から始まるインデックス値を使って指定します。すべてのコンテナには、childDescriptors プロパティがあります。
コンテナ内のコントロールが直ちにインスタンス化されるか、インスタンス化が保留されるかは、creationPolicy プロパティの値により決まります。インスタンス化が保留されている場合は、この Array のプロパティを使用すれば、各コンポーネントの ComponentDescriptor にアクセスし、指定した時刻にそのオブジェクトを生成できます。
childDescriptors プロパティは、オブジェクトの Array を指し示しているため、length などの Array 関数を使って、子に対して繰り返し処理を実行できます。次にその例を示します。
<?xml version="1.0"?>
<!-- layoutperformance/AccessChildDescriptors.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script><![CDATA[
import mx.core.ComponentDescriptor;
import flash.utils.*;
public function iterateOverChildren():void {
// Get the number of descriptors.
var n:int = tile.childDescriptors.length;
for (var i:int = 0; i < n; i++) {
var c:ComponentDescriptor = tile.childDescriptors[i];
var d:Object = c.properties;
// Trace ids and types of objects in the Array.
trace(c.id + " is of type " + c.type);
// Trace the properties added in the MXML tag of the object.
for (var p:String in d) {
trace("Property: " + p + " : " + d[p]);
}
}
}
]]></mx:Script>
<mx:Tile id="tile" creationComplete="iterateOverChildren();">
<mx:TextInput id="myInput" text="Enter text here"/>
<mx:Button id="myButton" label="OK" width="150"/>
</mx:Tile>
</mx:Application>
前の例で実行する SWF ファイルは以下のとおりです。
ComponentDescriptor のプロパティには id、type、および properties があります。properties プロパティは、MXML タグに明示的に追加されるプロパティを含むオブジェクトを参照します。このオブジェクトには、スタイルやイベントなどのプロパティは格納されません。
生成したコンポーネントは、ユーザーがアプリケーションを終了するか、コンポーネントを親からデタッチしてガベージコレクタで破棄するまで存続します。
親コンテナからコンポーネントをデタッチするには、removeChild() メソッドまたは removeChildAt() メソッドを使用します。コンテナからすべての子コントロールを削除する場合は、removeAllChildren() メソッドも使用できます。これらのメソッドを呼び出しても、オブジェクトがすぐにメモリから削除されるわけではありません。Adobe® Flash® Player では、子に対する参照がこれ以外にない場合は、将来のいずれかの時点にガベージコレクションが行われます。他のオブジェクトにその子への参照が保存されている場合、その子はメモリから削除されません。
これらのメソッドの使用の詳細については、『Adobe Flex リファレンスガイド』の View クラスを参照してください。
このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート