>k_nakamuraさん
サンプルつくりました。
Main.mxmlにViewStack用にSub1/2/3.mxmlの3画面を作りました。
画面の"<",">"を押すことでViewStackを前後に切り替えます。
その際に、各サブ画面に用意したsubCall()を呼び出しています。
※subCall()の中身はただのAlertです。
仕組みとしては、各Subのinitializeで親コンポであるMain.ViewStack
のChangeイベントに対してイベントハンドラを定義しています。
子→親の参照です。
■Main.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="*">
<mx:Script>
<![CDATA[
private function allowBtnOnClick(e:Event):void
{
if (e.currentTarget.label == ">")
{
if (vs.selectedIndex < vs.childDescriptors.length-1)
{
vs.selectedIndex++;
}
}
else
if (e.currentTarget.label == "<")
{
if (vs.selectedIndex > 0)
{
vs.selectedIndex--;
}
}
else
{
vs.selectedIndex = 0;
}
}
]]>
</mx:Script>
<mx:ViewStack x="151.5" y="62" id="vs" width="200" height="200">
<mx:Canvas label="View 1" width="100%" height="100%">
<ns1:Sub1 x="0" y="0">
</ns1:Sub1>
</mx:Canvas>
<mx:Canvas label="View 2" width="100%" height="100%">
<ns1:Sub2 x="0" y="0">
</ns1:Sub2>
</mx:Canvas>
<mx:Canvas label="View 3" width="100%" height="100%">
<ns1:Sub3 x="0" y="0">
</ns1:Sub3>
</mx:Canvas>
</mx:ViewStack>
<mx:Button x="151.5" y="270" label="<" id="prevBtn" click="allowBtnOnClick(event);"/>
<mx:Button x="311.5" y="270" label=">" id="nextBtn" click="allowBtnOnClick(event);"/>
<mx:Button x="199.5" y="270" label="home" width="104" id="homeBtn" click="allowBtnOnClick(event);"/>
</mx:Application>
■Sub1.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" width="200" height="200" title="View1" initialize="onInitialize(event);">
<mx:Script>
<![CDATA[
import mx.events.FlexEvent;
import mx.controls.Alert;
private function onInitialize(e:FlexEvent):void
{
Main(parentDocument).vs.addEventListener(Event.CHANGE,subCall, false, 0, true);
}
public function subCall(e:Event):void
{
if (e.currentTarget.selectedIndex == 0)
{
Alert.show("Sub1 !! ");
}
}
]]>
</mx:Script>
</mx:Panel>
■Sub2.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" width="200" height="200" title="View2" initialize="onInitialize(event);">
<mx:Script>
<![CDATA[
import mx.events.FlexEvent;
import mx.controls.Alert;
private function onInitialize(e:FlexEvent):void
{
Main(parentDocument).vs.addEventListener(Event.CHANGE,subCall, false, 0, true);
}
public function subCall(e:Event):void
{
if (e.currentTarget.selectedIndex == 1)
{
Alert.show("Sub2 !!");
}
}
]]>
</mx:Script>
</mx:Panel>
■Sub3.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" width="200" height="200" title="View3" initialize="onInitialize(event);">
<mx:Script>
<![CDATA[
import mx.events.FlexEvent;
import mx.controls.Alert;
private function onInitialize(e:FlexEvent):void
{
Main(parentDocument).vs.addEventListener(Event.CHANGE,subCall, false, 0, true);
}
public function subCall(e:Event):void
{
if (e.currentTarget.selectedIndex == 2)
{
Alert.show("Sub3 !!");
}
}
]]>
</mx:Script>
</mx:Panel>
initializeで行っていますが、インスタンス生成の影響等もあるで
しょうから、creationCompleteイベントで行うほうが良い気がします。
1点難点なのが、前子画面が親のChangeイベントを参照しているので
選択されたViewに限らずイベントが発生してしまいます。よって、
これまた子画面から親のViewStack.selectedIndexを参照して、制御
しています。
またイベントリスナの破棄が若干気になるので、addEventLisener
にパラメータを与えて弱い参照にしています。
■イベントリスナ (AS3) とガーベジコレクション
http://weblogs.macromedia.com/akamijo/archives/2007/05/post_19.cfmいかがでしょう?