Flash viewMenuItems没有';将蒙皮应用于ViewNavigator应用程序时不显示

Flash viewMenuItems没有';将蒙皮应用于ViewNavigator应用程序时不显示,flash,apache-flex,flash-builder,Flash,Apache Flex,Flash Builder,当我不为ViewNavigator应用程序应用skinClass时,ViewMenuItems工作正常,但当我将自定义外观应用于ViewNavigator时,ViewMenuItems不会出现 我的Main.mxml文件包含 <?xml version="1.0" encoding="utf-8"?> <s:ViewNavigatorApplication xmlns:fx="http://ns.adobe.com/mxml/2009"

当我不为ViewNavigator应用程序应用skinClass时,ViewMenuItems工作正常,但当我将自定义外观应用于ViewNavigator时,ViewMenuItems不会出现

我的Main.mxml文件包含

    <?xml version="1.0" encoding="utf-8"?>
    <s:ViewNavigatorApplication xmlns:fx="http://ns.adobe.com/mxml/2009"                                  xmlns:s="library://ns.adobe.com/flex/spark" firstView="views.MainHomeView"                                skinClass="skins.CustomApplicationSkin">
        <fx:Declarations>
            <!-- Place non-visual elements (e.g., services, value objects) here -->
            </fx:Declarations>
    </s:ViewNavigatorApplication>

CustomApplicationSkin的代码为

<?xml version="1.0" encoding="utf-8"?>
<s:Skin name="CustomApplicationSkin"
            xmlns:fx="http://ns.adobe.com/mxml/2009"
                     xmlns:s="library://ns.adobe.com/flex/spark"
                               >

    <fx:Metadata>
                <![CDATA[ 
                [HostComponent("Main")]
                ]]>
            </fx:Metadata> 

    <s:states>
                <s:State name="normal" />
                 <s:State name="disabled" />
             </s:states>

    <s:BitmapImage width="100%" height="100%" source="@Embed('/assets/background.jpg')"/>

    <s:Group id="contentGroup" width="100%" height="100%" minWidth="0" minHeight="0" />

    <s:ViewNavigator id="navigator" width="100%" height="100%" />

</s:Skin>

MainHomeView.mxml的代码

<?xml version="1.0" encoding="utf-8"?>
<!-- components\mobile\views\ViewMenuHome.mxml -->
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        title="Home">

    <fx:Script>
        <![CDATA[
        // The event listener for the click event.
            private function itemClickInfo(event:MouseEvent):void {
                switch (event.currentTarget.label) { 
                    case "Add" : 
                        myTA.text = "Add selected"; 
                        break; 
                    case "Cancel" : 
                        myTA.text = "Cancel selected"; 
                        break; 
                    case "Delete" : 
                        myTA.text = "Delete selected"; 
                        break; 
                    case "Edit" : 
                        myTA.text = "Edit selected"; 
                    break; 
                case "Search" : 
                    myTA.text = "Search selected"; 
                        break; 
                default : 
                    myTA.text = "Error"; 
                }                
            }
        ]]>
    </fx:Script>

    <s:viewMenuItems>
        <s:ViewMenuItem label="Add" click="itemClickInfo(event);" />
        <s:ViewMenuItem label="Cancel" click="itemClickInfo(event);"/>
        <s:ViewMenuItem label="Delete" click="itemClickInfo(event);"/>
        <s:ViewMenuItem label="Edit" click="itemClickInfo(event);"/>
        <s:ViewMenuItem label="Search" click="itemClickInfo(event);"/>
    </s:viewMenuItems>

    <s:VGroup paddingTop="10" paddingLeft="10">
        <s:TextArea id="myTA" text="Select a menu item"/>
        <s:Button label="Open Menu" 
              click="mx.core.FlexGlobals.topLevelApplication.viewMenuOpen=true;"/>
        <s:Button label="Close Menu" 
              click="mx.core.FlexGlobals.topLevelApplication.viewMenuOpen=false;"/>
    </s:VGroup>
</s:View>


请协助。

有两个问题:

  • 您的蒙皮不包括菜单(ViewMenu对象)
  • ViewNavigatorApplicationSkin
    类是用Actionscript编写的,它扩展了
    MobileSkin
    类,而您的皮肤是用MXML编写的,它扩展了
    skin
  • 第一个问题很容易解决:我在皮肤中添加了一个“初始化”事件处理程序,其中我实例化了
    ViewMenu
    对象,方法与默认移动皮肤的构造函数(
    ViewNavigatorApplicationSkin
    )相同

    但是,这样做之后,我在运行时尝试打开“视图”菜单时出错。此错误是上述第二个问题的结果:
    ViewNavigatorApplication
    中的代码试图使用
    addChild()
    方法添加菜单,但是,由于自定义皮肤扩展了非移动
    皮肤
    类(本质上是Spark
    ),它抛出一个错误,说明您不能使用
    addChild()
    方法,而应该使用
    addElement()
    。此错误是皮肤基于非移动皮肤类(主机组件,
    ViewNavigatorApplication
    ,不希望出现这种情况)的直接结果

    我建议您通过扩展原始的
    ViewNavigatorApplicationSkin
    类,在Actionscript中创建皮肤。看起来您所做的只是添加一个背景,所以下面的代码可能会起作用。但是,问题是在您的皮肤中,
    ViewNavigator
    和背景图像的宽度/高度都是100%。所以导航器完全覆盖了背景。在我下面的例子中,我给了导航器一些透明度,让背景显示出来。我想你不会想要的,但在你目前的设计中,这是看到图像的唯一方式

    package
    {
        import spark.components.Image;
        import spark.skins.mobile.ViewNavigatorApplicationSkin;
    
        public class MyViewNavAppSkin extends ViewNavigatorApplicationSkin
        {
            public function MyViewNavAppSkin()
            {
                super();
            }
    
            [Embed('Android_Robot_100.png')]
            private var embeddedImage:Class;
    
            private var background:Image;
    
            override protected function createChildren():void
            {
                super.createChildren();
                background = new Image();
                background.source = new embeddedImage();
                addChildAt(background, 0);
                navigator.alpha=.5;
            }
    
            override protected function layoutContents(unscaledWidth:Number, unscaledHeight:Number):void
            {
                background.setLayoutBoundsSize(unscaledWidth, unscaledHeight);
                background.setLayoutBoundsPosition(0,0);
                super.layoutContents(unscaledWidth, unscaledHeight);
            }
        }
    }
    

    问题依然存在。背景图像仅出现在屏幕中间。顶部和底部区域仍然为空。@user2339927嗯,我“帮助”您解决的问题是菜单没有出现。我的示例(我测试过)运行正常,菜单出现,在我的示例中,背景图像覆盖了整个应用程序。。。尽管如此,我需要使导航器透明以查看背景。也许你可以编辑你的帖子并显示你当前使用的代码,但不知道为什么上面的代码对你来说不起作用:)谢谢你的帮助sunil。代码和我上面贴的一样。我刚刚在main.mxml的s:viewNavigator应用程序中将skinClass更改为MyViewNavAppSkin