我正在开发一个应用程序,我需要基本上有两个独立的屏幕,我需要能够在它们之间切换。我是Flex& amp;的总菜鸟Flash和我在谷歌搜索的两天内没有找到任何关于如何做到这一点。真的不应该这么难! :)
这是我尝试过的。我创建了一个Flex项目并添加了两个名为Test1& amp;的MXML组件文件。 Test2和每个按钮都有一个按钮,其标签为Button1& Button2所以我可以看到是否显示正确的组件。下面是Test1 MXML组件文件中的按钮代码:
<s:Button id="btn1" label="Button1" click="currentState = 'State2'">
在MXML应用程序文件中,我有2个状态称为State1&amp;状态2。我也将以下内容添加到此文件中:
<local:Test1 includeIn="State1" x="0" y="0"></local:Test1>
<local:Test2 includeIn="State2" x="0" y="200"></local:Test2>
我还将状态添加到所有3个文件中:
<s:states>
<s:State name="State1"/>
<s:State name="State2"/>
</s:states>
当我运行应用程序时,我看到Test1正如我所期望的那样,因为State1是列出的第一个状态。当我单击Test1中的按钮(标记为Button1)时,我希望它现在显示Test2 MXML组件(因为我将currentState更改为'State2',但它没有。测试1仍然显示Button1显示。
有人能否解释我做错了什么?或者提出一个更好(或适当)的方法来做到这一点?
提前致谢!
答案 0 :(得分:2)
听起来您的应用程序中的状态未连接到组件中的状态。只是给它们相同的名称不会以任何方式连接它们。无论如何,如果您只是想在主应用程序中隐藏/切换组件,那么您实际上只需要那里的状态。
一种选择是直接从组件中访问应用程序的currentState
属性:
<s:Button id="btn1" label="Button1" click="FlexGlobals.topLevelApplication.currentState = 'State2'"/>
这样做有效,但不建议这样做,因为它强烈地将组件与父应用程序耦合在一起,如果你必须重构(或与其他人一起工作),在一个大型项目中会导致混乱。
另一个选择是让每个组件调度一个事件让父母知道它应该改变:
<fx:Metadata>
[Event(name="changeParentState", type="flash.events.Event")]
</fx:Metadata>
<s:Button id="btn1" label="Button1" click="dispatchEvent(new Event('changeParentState'));"/>
然后,父母将决定应切换到哪个州:
<local:Test1 includeIn="State1" changeParentState="currentState='State2'" />
<local:Test2 includeIn="State2" changeParentState="currentState='State1'" />
这种方式更通用,只是更好的OOP。但是,如果您希望组件能够触发的不仅仅是单个状态,则可能需要执行更复杂的操作。这应该让你了解至少去哪里。