Доступ ко всем представлениям в ViewNavigatorApplication (мобильное приложение Flex)


Моя цель
Я хотел бы создать приложение для PlayBook (с использованием Flex) с пользовательским интерфейсом, аналогичным веб-браузеру PlayBook. Под подобным я подразумеваю, что хочу реализовать меню, которое отображается, когда пользователь проводит пальцем вниз от верхней панели планшета. Мне нравится эта функция, потому что я могу рисовать на ней, размещать множество других объектов и обрабатывать все виды событий, не используя пространство экрана, когда это не нужно. Кроме того, в PlayBook нет кнопки «Меню», как на некоторых телефонах.
В зависимости от конфигурации, выбранной из первого представления, ряд других представлений будет помещен в представление стека. Когда пользователь получит доступ к раскрывающемуся меню, я хотел бы показать в виде снимка эскиза мое основное (представление конфигурации) и остальные представления, которые находятся в стеке представлений. Это в основном покажет пользователю, что происходит в другом представлении, и позволит ему выбрать, на какой из них переключиться.

Пока выполнено
Меню доступно из любого представления, но код для обработчика событий находится в моем основном файле MXML (project.MXML), я нашел это быть единственным способом иметь одно меню для всех представлений. Мне удалось вытащить меню из любого представления и отобразить эскиз текущего представления.

Моя проблема
Как получить доступ ко всем просмотрам. Я пытался весь день, и все мои испытания дают мне доступ к активному представлению и моему объекту меню. Вот код, чтобы показать, что происходит:

// This is in my default view MXML

navigator.pushView(MainView);
navigator.pushView(SecondView);
navigator.pushView(ThirdView);
navigator.pushView(FourthView);

.......

// And this is where I try to gain access to my Views (in the Project.MXML)

var totalViews:int = navigator.length;//Length is 5 (4 Views plus menu which is wright)
var obj:Object;

for(var i:int = 0; i < totalViews; ++i)
{
    obj = navigator.getElementAt(i);// Tried child here, it's not working either
    var currentThumbnail:Preview = new Preview();
    var bmData:BitmapData        = new BitmapData( obj.stage.width, obj.stage.height );

    bmData.draw(obj.stage);
    currentThumbnail.setSize( m_previewH, m_previewW );
    currentThumbnail.setBitmap( bmData );
    currentThumbnail.setLayoutBoundsPosition(i * m_previewW + PREVIEW_GAP * i, 10);
    slideMenu.addChild( currentThumbnail );

    trace(i.toString() + " " + obj.toString());
}


Как я уже упоминал выше, этот цикл for успешно выполнит задание для текущего представления, после чего произойдет сбой. Кто-нибудь знает, как пройти цикл по всем представлениям?
Это мое первое приложение с flex, поэтому, если есть какие-то альтернативы моему подходу, я буду рад их попробовать. Хотя я хотел бы придерживаться одного ViewNavigator вместо навигатора с вкладками и нескольких представлений вместо состояний, я не возражаю против предложений с этой стороны.
TIA.


person unexplored    schedule 13.09.2011    source источник


Ответы (1)


Я почти уверен, что из-за нехватки памяти Flex не будет хранить в памяти более одного экземпляра представления за раз. Таким образом, перебор количества представлений и попытка доступа к экземпляру этого представления вызовут проблемы; потому что представление, по сути, создается каждый раз, когда оно отображается, и уничтожается каждый раз, когда оно скрывается.

Я думаю, что для того, чтобы делать то, что вы хотите, вам придется создавать снимки представлений самостоятельно. Возможно, как в растровых изображениях памяти, которые будут существовать, даже если представление не на экране. Или, возможно, вы захотите временно сохранить их на диск для целей памяти. Или, что еще лучше, вы можете предоставить «предварительно обработанные» изображения.

В любом случае, затем сохраните список изображений, связанных с видами, и отобразите их в меню стиля «Полка дисплея».

person JeffryHouser    schedule 13.09.2011
comment
Я рассмотрел ваше предложение раньше. Причина, по которой я разместил этот вопрос, заключается в следующем: когда я помещаю точку останова в код и расширяю переменную навигатора, я могу видеть все свои представления (сейчас не помню, на каком узле), поэтому я подумал, что могу получить к ним доступ - person unexplored; 14.09.2011
comment
ЕСЛИ они там есть; имеет смысл иметь к ним доступ. Без запуска кода и тестирования; Я не могу точно сказать, что происходит. - person JeffryHouser; 14.09.2011
comment
@unexplored: у меня была похожая проблема. Решение, которое я выбрал, здесь не применимо, но другие, которые я нашел, могут. - person chb; 04.12.2011