Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   кнопка Back на андроиде, preventDefault и flex (http://www.flasher.ru/forum/showthread.php?t=208469)

PainKiller 17.07.2014 17:22

кнопка Back на андроиде, preventDefault и flex
 
Ситуация такая. Есть views, с разными состояниями, которые меняются при работе пользователя в приложении. Воодушевившись этим постом , я решил сделать так, чтобы при нажатии кнопки Back, пользователь возвращался бы не к предыдущему view, а к предыдущему состоянию компонента. Для этого в главном классе приложения я написал следующий код:
Код AS3:

//срабатывает при запуске приложения
private function onAdded(e:Event):void
                        {
                                NativeApplication.nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown, false, 0, true);
                                ...
                        }
 
private function onKeyDown(e:KeyboardEvent):void
                        {
                                trace ("onKeyDown main");
                                trace (navigator.activeView.id);
                                if (e.keyCode == Keyboard.BACK)
                                {
                                        if ((navigator.activeView.id == "SomeState" && navigator.activeView.currentState == "SelectOneList") ||
                                                (navigator.activeView.id == "SomeState" && navigator.activeView.currentState == "SelectSpinners") ||
                                                (navigator.activeView.id == "SomeState" && navigator.activeView.currentState == "SelectManyList") )
                                        {
                                                e.stopImmediatePropagation();
                                                e.preventDefault();
                                                //trace (e.cancelable);
                                                navigator.activeView.currentState = "default";
                                                trace (e.isDefaultPrevented() + " prevented");
                                                trace(navigator.activeView.currentState);
                                                trace(navigator.activeView.id);
                                        }
                                }
                        }

cancelable для евента я проверил, тут все нормально. Так вот в дебаггере видно, как все четко отрабатывает, трейсится нужное состояние и вью. Но визуально, перехвата события не происходит, все равно все откатывается на предыдущий вью. Единственный вариант решения который я вижу - переделать состояния на вьюхи, но это получится геморно и некрасиво. В общем жду советов, заранее спасибо.

Добавлено через 4 минуты
Да еще пробовал насильно заталкивать нужный view вот этой строчкой в обработчике события:
Код AS3:

navigator.pushView(views.SomeView);

но это дает только белый экран.

Добавлено через 10 минут
вообще много чего пробовал, менял местами строчки и т.д., пришел к парадоксальному выводу, что именно добавление этой строки
Код AS3:

navigator.activeView.currentState = "default";

возвращает предыдущий view, без нее все перехватывается.

Добавлено через 19 часов 21 минуту
В общем путем экспериментов нащупал решение, оно почему то по разному ведет себя в эмуляторе и на реальном аппарате, привожу код:
в главном классе приложения
Код AS3:

NativeApplication.nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown, false, 0, true);
 
...
 
private function onKeyDown(e:KeyboardEvent):void
                        {
 
                                if (e.keyCode == Keyboard.BACK)
                                {
                                        if ((navigator.activeView.id == "SomeState" && navigator.activeView.currentState == "SelectOneList") ||
                                                (navigator.activeView.id == "SomeState" && navigator.activeView.currentState == "SelectSpinners") ||
                                                (navigator.activeView.id == "SomeState" && navigator.activeView.currentState == "SelectManyList") )
                                        {
                                                trace(navigator.activeView.currentState);
                                                trace(navigator.activeView.id);
 
                                        }
                                }
                        }

В вьюхе, в которой по кнопке Back нужно менять стейты:
Код AS3:

<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
                xmlns:s="library://ns.adobe.com/flex/spark"
                ...
                currentState="default" backKeyPressed="backKeyPressedHandler(event)">
 
private function backKeyPressedHandler(e:FlexEvent):void
                {
                        trace("backKeyPressedHandler");
                        trace(e.type); //backKeyPressed
                        trace(e.target);
                        trace(currentState);
                        if(currentState == "SelectOneList" || currentState == "SelectSpinners" || currentState == "SelectManyList")
                        {
                                e.preventDefault();
                                e.stopImmediatePropagation();
                                this.currentState = "default";
 
                        }
 
                }

Так вот, какие странности в работе. В эмуляторе это решение срабатывает только со 2-го нажатия клавиши (только со второго раза срабатывает обработчик backKeyPressedHandler). Без обработчика в главном классе (а глядя на код можно подумать что он не нужен) в эмуляторе у меня это решение вообще не работало. На телефоне вроде все работает нормально, с первого нажатия, но честно говоря до конца эту логику я не понимаю, буду рад любым комментариям.

alatar 20.07.2014 12:39

В "главном" классе в обработчике необходимости нет. Во view уберите строку:
Код AS3:

e.stopImmediatePropagation();


PainKiller 21.07.2014 16:22

Спасибо за отклик. Сделал так как вы посоветовали. В вашей версии на телефоне работает, в эмуляторе нет. Но в любом случае проблема решена.


Часовой пояс GMT +4, время: 19:12.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.