1

我有一个带有表单的 Blackberry playbook Flex 应用程序。有一个 TextArea 输入,当“聚焦”时,会推送一个带有全屏文本区域的新视图。当该全屏文本区域被填充时,单击一个按钮并将屏幕弹出到原始表单...

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

4

2 回答 2

2

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

[1] 的第二个参数pushView接受任何对象:

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

[2] 弹出视图时重写createReturnObject创建返回对象:

public function createReturnObject():Object

[3] 在 vi​​ewActivate 事件处理程序中,data-property 将保存您推送的对象。

于 2011-06-15T05:29:34.177 回答
1

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

我的视图.as

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

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

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

  1. 登录页面 -> 120
  2. 结果页面 -> 200
  3. ETC...

    <?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>
    

我的组

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

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>
于 2011-06-16T10:47:53.987 回答