PDA

Просмотр полной версии : Не обрабатывается кнопка Back на мобильном


Astraport
15.01.2012, 21:04
Создаю мобильный проект на Flex. Использую ViewNavigatorApplication и несколько View.
Обратная навигация осуществляется двумя способами: хардверной клавишей Back и кнопкой "Назад" в заголовке каждого View. В первом случае производятся переходы по истории открытия вкладок с помощью navigator.popView();. Во втором, программно определяется на какую вкладку нужно вернуться - navigator.pushView(views.View);.

Все работает, но нужно чтобы на первом View (то что firstView) по нажатию на клавишу Back выводилась вьюшка с предложением закрыть приложение. Я оверрайдю backKeyUpHandler в главном MXML:
override protected function backKeyUpHandler(event:KeyboardEvent):void
{
if (navigator.activeView.id == "first"){
navigator.pushView(views.MyAppExitView);
} else {
navigator.popView();
}
}

Тоже работает, но только в случае, если возврат на первую вьюшку осуществляется программно (то есть navigator.pushView(views.MyAppFirstView);). Если вернуться с помощью клавиши Back, то backKeyUpHandler не обрабатывается.

Нет мыслей как решить проблему?
Спасибо.

Ivanaka
25.01.2012, 19:09
Я ViewNavigatorApplication не использую, может не совсем то что вам нужно. Вот как вешаю действия на хардварные кнопки:


//вешаем слушатель для кнопок
private function enableHardwareKeyListeners(event:FlexEvent):void {
NativeApplication.nativeApplication.addEventListener("keyDown", handleButtons, false, 0, true);
}
//функция выхода из приложения
public function closeApp():void{
NativeApplication.nativeApplication.exit();
}
//функция слушателя
private function handleButtons(e:KeyboardEvent):void{
if(e.keyCode == Keyboard.BACK)//если кнопка Back
{
e.preventDefault();
if (currentState != 'general'){//если находимся не на главном view/state
currentState = 'general';//идем на главный вид
}else{//если находимся на главной - вызываем диалоговое окно для закрытия приложения. Для закрытия юзаем closeApp()
alertShow('EXIT');
}
}
else if(e.keyCode == Keyboard.MENU){//если кнопка Menu
e.preventDefault();
//вызываем меню или еще чего
}
}

Genzo
25.01.2012, 19:17
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
actionBarVisible="false" overlayControls="false" tabBarVisible="false" viewActivate="loadData()" viewDeactivate="die()" backKeyPressed="event.preventDefault();myCustonEvent();" >

Добавлено через 30 секунд
backKeyPressed="event.preventDefault();myCustonEvent();"

Astraport
25.01.2012, 19:23
Ivanaka, спасибо. Я ещё попробую, конечно, но тогда все способы кажется перепробовал.

Добавлено через 2 минуты
Genzo, и это тоже попробую:)

Там проблема была в том, что выход по Back нужно сделать на первой View, а с остальных переход по иерархии назад.