动态定位的Flex组件

时间:2008-10-16 19:54:39

标签: flex dynamic layout

我对当前项目(将在Flash播放器中运行的Flex应用程序)有一个要求,即在表单上显示组件的任意子集,同时根据应用程序状态的某些方面隐藏所有其他组件。有大约十几个不同的文本框和下拉菜单,但有些根据以前输入的用户数据变得无关紧要,我们不想在我们到达这个特定表单时显示它们。每次显示此表单时,我都需要显示这些组件的许多排列中的任何一个。

我正在尝试确定解决此问题的最佳方法是什么。我应该创建一个包含所有必需控件的Canvas(或其他容器),然后在我不需要的那些上设置visible = false吗?然后问题就是确保布局看起来不错。我不希望隐藏控件存在间隙。

我想到的另一个选项就是有一个机制可以动态实例化TextInput或CheckBox等组件,然后调用container.addChild(control)来构建组件而不必担心差距问题。

这似乎是一个在flex中有惯用解决方案的问题,但我不知道它是什么。这些想法都不是很好,所以我想知道是否有其他人有更好的想法。

3 个答案:

答案 0 :(得分:5)

最佳实践方法是使用状态。例如:

<mx:states>
    <mx:State name="State1">
        <mx:AddChild position="lastChild">
            <components.../>
        </mx:AddChild>
    </mx:State>
    <mx:State name="State2">
        <mx:AddChild position="lastChild">
            <mx:Canvas.../>
        </mx:AddChild>
        <mx:AddChild position="lastChild">
            <mx:VBox.../>
        </mx:AddChild>
    </mx:State>
</mx:states>

然后在你的代码中,你调用this.currentState =“State1”来启用第一个状态等。使用状态,你可以有选择地显示和隐藏组件。

我建议使用google搜索flex状态教程并尝试一些以正确理解状态如何工作。

答案 1 :(得分:4)

我不知道这是不是一个好的解决方案,但当我处于完全相同的情况时,我基本上做了第一种方法。设置visible = false并设置includeInLayout = false以防止您谈论的那些“差距”。这是一个非常简单的解决方案,非常容易和快速实现......也许其他人知道更具惯用性的东西。

答案 2 :(得分:0)

如果状态不起作用,请查看解释组件生命周期的文章。

如果您创建一个扩展Flex组件(如Canvas)的类,您将在函数中定义覆盖createChildren的所有组件。您将在另一个覆盖updateDisplayList

的函数中重新访问该布局