使用ViewNavigatorApplication状态和firstView的flex 4移动问题

时间:2011-05-17 11:02:06

标签: flex flex4.5

我正在努力制作我的第一个Flex移动应用程序(虽然我不是Flex的新手),而且我在第一个障碍时绊倒了。

在尝试使用带有状态的 firstView 时,我无法获取 ViewNavigatorApplication 来显示视图,例如 firstView.phone firstView.tablet

我只剩下一个空白的操作栏和内容区域。

如果我尝试设置没有状态的设置 firstView (例如 firstView =“view.HomeView”),则视图加载正常。

以下是代码:

<s:ViewNavigatorApplication
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    firstView.phone="views.HomeView"
    firstView.tablet="views.TabletHomeView"
    applicationDPI="160" 
    creationComplete="initApplication()">
    <s:states>
        <s:State name="portraitPhone" stateGroups="portrait, phone"/>
        <s:State name="landscapePhone" stateGroups="landscape, phone"/>
        <s:State name="portraitTablet" stateGroups="portrait, tablet"/>
        <s:State name="landscapeTablet" stateGroups="landscape, tablet"/>
    </s:states>
    <fx:Style source="assets/css/application.css"/>
    <fx:Script>
        <![CDATA[
            import mx.events.ResizeEvent;

            private var isPortrait:Boolean;
            private var isTablet:Boolean;

            private function initApplication():void
            {               
                addEventListener(ResizeEvent.RESIZE, resizeHandler);
                addEventListener(Event.ADDED_TO_STAGE, resizeHandler);
            }

            private function resizeHandler(event:*):void
            {
                isPortrait = (stage.height > stage.width);
                isTablet = (stage.height > 950 || stage.width > 950);

                currentState = (isPortrait ? "portrait" : "landscape") + (isTablet ? "Tablet" : "Phone");
            }
        ]]>
    </fx:Script>
</s:ViewNavigatorApplication>

我已经用谷歌搜索了这个,看了ViewNavigatorApplication specification并且没有发现其他人有这个问题,或者没有任何证据证明我做错了(尽管我仍然怀疑是这种情况)。 / p>

提前致谢!

4 个答案:

答案 0 :(得分:2)

最后我选择了@ www.Flextras.com评论[未作为答案]:

  

我还在学习自己,但如果我明白,你就不想   在ViewNavigatorApplication中创建这样的状态。这只是一个   虚拟容器,实质上。在视图中创建这样的状态。

我清空了所有州的ViewNavigatorApplication&amp;像这样的代码:

<?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"
    applicationDPI="160"
    splashScreenImage="com.mis.editor.mobile.sire.components.DynamicSplash"
    runtimeDPIProvider="com.mis.editor.mobile.helpers.RuntimeDPIHelper"
    firstView="SplashView">
    <fx:Style source="com/mis/editor/mobile/sire/assets/css/application.css"/>
</s:ViewNavigatorApplication>

我将代码放在第一个视图中,以检测设备是否为手机/平板电脑并重定向到相应的视图:

protected function push_login():void
{           
    var fadeTrans:CrossFadeViewTransition = new CrossFadeViewTransition();

    if(ScreenDetails.Format == 'phone')
    {
        navigator.pushView(PhoneLoginView, appDataMediator, null, fadeTrans);
    }
    else
    {
        navigator.pushView(LoginView, appDataMediator, null, fadeTrans);
    }           
}

感谢您的建议: - )

答案 1 :(得分:1)

在viewNavigatorApplication中写入视图内的状态(定义主应用程序文件.ViewNavigatorApplication容器不接受任何子项。)

答案 2 :(得分:0)

如果视图本身是状态,为什么要在视图导航器中显示状态?我相当确定它并不意味着以这种方式使用,并且不可能通过第一视图“加载”新视图。只需设置firstView,然后加载并相应地切换视图。

如果你想做一些“调整大小”的事情,我会在每个视图中添加调整大小代码为每个外形设计一个单独的应用程序,以便在重用代码时提供更好的体验(这是我的首选方法。)

答案 3 :(得分:0)

也许你可以在计算屏幕大小后尝试从actionscrtip设置firstView属性。请确保您在预先初始化活动中执行此操作。否则它将无法工作。