PopView到我们所在的屏幕上的位置

时间:2011-06-14 08:26:08

标签: flash flex actionscript-3 blackberry-playbook

我有一个Blackberry playbook Flex应用程序,它有一个表单。有一个TextArea输入,当“聚焦在”时,推动具有全屏文本区域的新视图。填充全屏文本区域时,单击一个按钮,屏幕将弹出为原始格式...

问题: 当我弹出第二个屏幕时,它返回到顶部的第一个表单,而不是保留我们在页面上的视图位置...无论如何返回到我们编辑的表单部分?

2 个答案:

答案 0 :(得分:2)

您可以使用包含最后滚动坐标的参数[1]推动编辑视图,当弹出[2]视图时,您可以将这些坐标设置为返回值,因此第一个窗体视图可以向下滚动[3]

[1] pushView的第二个参数采用任何对象:

navigator.pushView(EditView, {position:"someValue"});

[2]在弹出视图时覆盖createReturnObject以创建返回对象:

public function createReturnObject():Object
viewActivate eventhandler中的

[3] data - 属性将保存您推送的对象。

答案 1 :(得分:1)

从alopix的回复中汲取灵感,我提出了以下解决方案,该解决方案适用于整个应用程序。我必须扩展View类:

<强> MyView.as

这是必要的,以便每次视图变为活动状态(被查看)时,其verticalScrollPosition将存储在全局变量中的值(如下所示)。 “mainContent”是MyGroup的ID,用于存储实际MXML视图中的所有内容(因此我们可以跟踪它并更新其verticalScrollPosition)。

public class MyView extends View
{

    public function MyView()
    {
        super();
        this.addEventListener(FlexEvent.VIEW_ACTIVATE, goToCorrectViewpoint);
    }

    private function goToCorrectViewpoint(e:Event):void{
        trace("Setting vertical position to "+FlexGlobals.topLevelApplication.verticalPositionTracker[this.title]);
        if(FlexGlobals.topLevelApplication.verticalPositionTracker.hasOwnProperty(this.title))
            (this["mainContent"] as Group).verticalScrollPosition = FlexGlobals.topLevelApplication.verticalPositionTracker[this.title];
    }
}

用于存储每个页面的verticalScrollPosition的全局变量

我必须将所有Y坐标存储在名为verticalPositionTracker的全局变量中。这只是“页面标题”的对象=&gt; verticalScrollPosition(例如Y坐标)例如:

  1. 登录页面 - &gt; 120
  2. 结果页面 - &gt; 200
  3. 等...

    <?xml version="1.0" encoding="utf-8"?>
    <s:MobileApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                 xmlns:s="library://ns.adobe.com/flex/spark" firstView="view.LoginView" backgroundColor="0xF5FAFF">
    
    <fx:Script>
    <![CDATA[
        public var verticalPositionTracker:Object = new Object();
    ]]>
    </fx:Script>
    
    </s:MobileApplication>
    
  4. <强> MyGroup的

    然后我必须创建一个自定义组(包含滚动条中的所有数据),这样当用户向下滚动页面(更改verticalScrollPosition)时,全局变量将使用新位置进行更新。 / p>

    public class AirpointGroup extends VGroup
    {
    
        public var pageID:String;
    
        public function AirpointGroup()
        {
            super();
        }
    
        override public function set verticalScrollPosition(value:Number):void{
            if (layout)
            {
                layout.verticalScrollPosition = value;
            }
            trace("The position of "+this.pageID+" has changed to "+value);
            if(value!=0)
                FlexGlobals.topLevelApplication.verticalPositionTracker[pageID] = value;
        }
    }
    

    Results.mxml(工作示例) 然后我将这个组包含在视图中,其ID为“mainContent”(这很重要,因为它允许视图知道将y坐标设置到哪个组)

    <?xml version="1.0" encoding="utf-8"?>
    <components:MyView xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:components="components.*"
        xmlns:s="library://ns.adobe.com/flex/spark" title="Tasks" xmlns:mx="library://ns.adobe.com/flex/mx">
    
    <s:Scroller left="0" right="0" top="0" bottom="0">
        <components:MyGroup pageID="{this.title}" id="mainContent">
                      <!-- ALL CONTENT GOES HERE -->
        </components:MyGroup>
    </s:Scroller>
    
    
    </components:MyView>