PopView к месту на экране, где мы были - PullRequest
1 голос
/ 14 июня 2011

У меня есть приложение Blackberry Playbook Flex, которое имеет форму. Существует ввод TextArea, который, когда «фокусируется», выдвигает новое представление с полноэкранной текстовой областью. Когда эта полноэкранная текстовая область заполнена, нажимается кнопка, и экран возвращается к исходной форме ...

Проблема: Когда я открываю этот 2-й экран, он возвращается к первой форме сверху, не сохраняя позицию просмотра, в которой мы находились на странице ... Есть ли способ вернуться к той части формы, которую мы редактировали?

Ответы [ 2 ]

2 голосов
/ 15 июня 2011

Вы можете выдвинуть окно редактирования с параметром [1], который содержит последние координаты прокрутки, и при появлении [2] представления вы можете установить эти координаты как возвращаемое значение, поэтому первый вид формы можно прокрутить назад вниз[3].

[1] Второй аргумент pushView принимает любой объект:

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

[2] Переопределите createReturnObject, чтобы создать объект возврата при открытии представления:

public function createReturnObject():Object

[3] в обработчике событий viewActivate свойство data будет удерживать ваш выдвинутый объект.

1 голос
/ 16 июня 2011

Вдохновившись ответом alopix, я нашел следующее решение, которое работало во всем приложении.Я должен расширить класс View:

MyView.as

Это было необходимо для того, чтобы каждый раз, когда представление становилось активным (просматривалось), его вертикальScrollPosition сохраняласьзначение в глобальной переменной (показано далее).«mainContent» - это идентификатор MyGroup, который хранит все в фактическом представлении 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.Это был просто объект "Page Title" => 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>
    

MyGroup

Затем мне пришлось создать пользовательскую группу (которая будет содержатьвсе данные в скроллере), поэтому, когда пользователь прокручивает страницу вниз (изменяя 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 (Рабочий пример) Затем я включил эту группу в представление с идентификатором "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>
...