2010-09-28 52 views
1

我想动态地(在运行时)向容器添加新状态,并且为此状态添加不同的元素(如TextInput,Label等)。这必须从actionscript完成,我不使用任何mxml文件。我可以添加状态并更改不同元素的属性或样式,但我没有想出如何为不同状态添加子元素。Flex 4 - 在运行时从动作创建状态并添加元素

回答

4

您必须手动创建State类的实例并为其创建覆盖。然后将新创建的状态添加到组件的状态数组中。

这里有一个小例子空气的应用程序,展示了如何做到这一点:

<?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[ 
      import mx.events.FlexEvent; 
      import mx.states.AddChild; 
      import mx.states.AddItems; 
      import mx.states.SetProperty; 
      import mx.states.State; 

      protected function createState(event:MouseEvent):void 
      { 
       var label:Label = new Label(); 
       label.text = "World!"; 

       var addLabel:AddItems = new AddItems(); 
       addLabel.relativeTo = foo; 
       addLabel.position = "after"; 
       addLabel.items = label; 

       var helloWorld:State = new State(); 
       helloWorld.name = "helloWorld"; 
       helloWorld.overrides = [addLabel]; 

       states = [helloWorld]; 
       currentState = "helloWorld"; 
      } 
     ]]> 
    </fx:Script> 

    <s:layout> 
     <s:VerticalLayout /> 
    </s:layout> 

    <s:Label id="foo" text="Hello" /> 

    <s:Button label="Create new state" click="createState(event)" /> 
</s:WindowedApplication> 
+0

谢谢你的快速反应。 – accexpert 2010-09-28 13:10:09

+0

这我已经想通了但我想添加到特定的自定义状态新的元素,如:TextInput,标签等,所以我可以在运行时显示动态创建的不同状态的不同元素。 – accexpert 2010-09-28 13:11:28

+0

适用相同的概念,只需使用AddItems或AddChild覆盖。使用前者将子项添加到Spark(Flex 4)容器,后者用于MX(Flex 3)组件。我已经更新了示例以显示它在此应用程序中的工作方式。 – 2010-09-28 13:25:46