【问题标题】:PopView to the location on screen we were atPopView 到我们在屏幕上的位置
【发布时间】:2011-06-14 08:26:08
【问题描述】:

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

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

【问题讨论】:

  • PlayBook 设备故障太多,我认为您无法做到这一点。放+1

标签: flash apache-flex actionscript-3 blackberry-playbook


【解决方案1】:

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

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

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

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

public function createReturnObject():Object

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

【讨论】:

    【解决方案2】:

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

    MyView.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. 等等……

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

    我的组

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

    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>
    

    【讨论】:

    • 从别人那里获得灵感却把“正确答案”归功于自己是一种不好的形式。更好:给@alopix 的“正确答案”信用并评论他,说“这很有帮助!看看我的答案,我最终想出了什么。”
    • 很公平,但 alopix 的答案并不完整,因为我们必须继续通过 y 坐标。如果我们离开那个页面然后回来,滚动位置就会丢失。此外,如果我们的应用程序已经传递了有关的数据,它可能会这样做,我们将不得不更改我们的整个应用程序以适应这种情况。给他一个 + 和一个勾号,即使他的解决方案不完整,也不是和我的很相似......这个线程的新手会自动使用他的解决方案,因为他有勾号
    • 这就是你在他的底部添加评论的原因。这个网站不是要提出完整的解决方案。它是关于提供想法和答案,以帮助您获得完整的解决方案。特别是如果问题/答案很复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多