【问题标题】:Flex Mobile: preventing back button from exiting appFlex Mobile:防止后退按钮退出应用程序
【发布时间】:2013-11-18 15:51:41
【问题描述】:

我正在为一些 android 平板电脑开发一个 Flex Mobile 应用程序,直到现在我一直无法阻止返回按钮离开应用程序。我仍然希望它是常规功能,只是我不希望它退出应用程序。我希望用户手动执行此操作。

关于如何实现这一目标的任何想法?也许通过捕捉一些事件?任何帮助将不胜感激。

问候,

塞巴斯蒂安

【问题讨论】:

    标签: android actionscript-3 apache-flex back-button flex-mobile


    【解决方案1】:

    我是这样处理的:

    <?xml version="1.0" encoding="utf-8"?>
    <s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
            xmlns:s="library://ns.adobe.com/flex/spark"
            initialize="init()"
            viewActivate="activate(event)"
            viewDeactivate="deactivate(event)">
    
    <fx:Declarations>
        <fx:Component className="ConfirmExit">
            <s:Callout 
                horizontalPosition="middle"
                verticalPosition="middle">
                <s:VGroup width="100%">
    
                    <s:Label text="Really quit?" />
    
                    <s:HGroup width="100%">
    
                        <s:Button label="Yes"
                                  click="close(true)" />
                        <s:Button label="No"
                                  click="close(false)" />
                    </s:HGroup>
                </s:VGroup>
            </s:Callout>        
        </fx:Component>
    </fx:Declarations>
    
    <fx:Script>
        <![CDATA[
            import spark.events.ViewNavigatorEvent;
    
            private function activate(event:ViewNavigatorEvent):void {
                // add exit confirmation dialog - Samsung Apps requirement
                if (Capabilities.version.indexOf('AND') >= 0 &&
                    Capabilities.manufacturer.search(/Samsung/i) >= 0) {
                    _confirmExit.addEventListener(PopUpEvent.CLOSE, handleLeaveCallback, false, 0, true);
                    stage.addEventListener(KeyboardEvent.KEY_UP, handleKeyUp, false, 1, true);
                } 
            }
    
            private function deactivate(event:ViewNavigatorEvent):void {
                _confirmExit.removeEventListener(PopUpEvent.CLOSE, handleLeaveCallback);
                stage.removeEventListener(KeyboardEvent.KEY_UP, handleKeyUp);
            }
    
            private function handleKeyUp(event:KeyboardEvent):void {
                if (event.keyCode == Keyboard.BACK /* && navigator.length == 1 */) {
                    _confirmExit.open(this, true);
                    // event.preventDefault();
                }
            }
    
            private function handleLeaveCallback(event:PopUpEvent):void {
                if (!event.commit)
                    return;
    
                try {
                    NativeApplication.nativeApplication.exit();
                } catch (e:Error) {
                }
            }
    

    即不要调用任何基类方法,这里使用优先级 1:

    stage.addEventListener(KeyboardEvent.KEY_UP, handleKeyUp, false, 1, true);
    

    【讨论】:

    • 您好 Alexander,我必须在 if (event.keyCode == Keyboard.BACK) 之后添加 event.cancelable; event.preventDefault(); 才能阻止应用离开。您能否将其添加到您的答案中,以便我将其标记为正确答案?感谢您的帮助。
    • 我还添加了 Josh 提到的 (navigator.length == 1) 部分,这样后退按钮就可以像往常一样正常工作,但是当只剩下一个 View 时。
    • 我真的不需要navigator.length == 1,因为那是我在堆栈上的第一个视图。
    • 对不起,亚历山大。我试过这段代码,但没有用。它不会停止“返回键”的默认操作。我做了几乎和你一样的事情。使用 viewActivate 和 viewDeactivate。唯一的区别是我没有使用 CallOut 组件(我使用的是 Flex 4.5)。我有以下内容:'private function handleKeyUp(event:KeyboardEvent):void { if (event.keyCode == Keyboard.BACK) { event.preventDefault(); event.stopImmediatePropagation(); }'。如果你能帮助我找出我做错了什么,我真的很感激。问候,塞巴斯蒂安
    • 添加监听器时是否使用优先级1?
    【解决方案2】:

    解决此问题所需的唯一代码如下:

    <s:ViewNavigatorApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                                xmlns:s="library://ns.adobe.com/flex/spark">
    
    ...
    
          <fx:Script>
            <![CDATA[
    
                       ...
    
                /**
                 * Overrides the default backKeyUpHandler method so the event 
                 * is stopped when there's only one View left on the navigator's stack. 
                 */
                override protected function backKeyUpHandler(event:KeyboardEvent):void
                {               
                    if (navigator.length == 1){                 
                        event.stopImmediatePropagation();                   
                        event.preventDefault();                 
                    }else{
                        super.backKeyUpHandler(event)
                    }
                }
    
            ]]>
        </fx:Script>
    
    </s:ViewNavigatorApplication>
    

    在您应该拥有的视图上:

    <s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
            xmlns:s="library://ns.adobe.com/flex/spark"
            xmlns:componets="componets.*"       
            viewActivate="addKeyListeners(event)"
            viewDeactivate="removeKeyListeners(event)">
    
    ...
            <fx:Script>
            <![CDATA[
                              ...
                /**
                 * Stops the Back key event.
                 */
                private function keyDown(event:KeyboardEvent):void
                {               
                    if(event.keyCode == Keyboard.BACK)
                    {
                        event.stopImmediatePropagation();                   
                        event.preventDefault();                 
                    }
                }
           ]]>
        </fx:Script>
    
    </s:View>
    

    感谢 Alexander 和 Josh 的帮助。

    问候,

    塞巴斯蒂安

    【讨论】:

      【解决方案3】:

      如果没有更多视图可弹出,ViewNavigator 将退出应用程序。您可以使用ViewNavigator.length 查看当前由它管理的视图数量。所以,理论上,这样的事情应该可以工作:

      stage.addEventListener( KeyboardEvent.KEY_UP, backButtonHandler );
      
      private function backButtonHandler( e:KeyboardEvent ):void {
          if ( e.charCode == Keyboard.BACK && this.navigator.length == 1 ) {
              e.stopImmediatePropagation();
          }
      }
      

      现在,这是未经测试的。但是,我相信它应该可以工作。您可能需要检查长度是否等于 0 而不是 1;我不确定当前视图是否计入我头顶的长度。但是,当没有更多要弹出的视图时,这应该可以防止后退按钮运行任何操作。

      【讨论】:

      • 感谢乔希的帮助。何时或如何在 Flex Mobile 上调用“舞台”?我尝试了您的建议,但是当我尝试添加侦听器时,它给了我“无法访问空对象引用的属性或方法”错误。
      • 我是用“applicationComplete”而不是“creationComplete”来做的。问题是它没有用。它仍然离开了应用程序。我用 '1'1 和 '0' 尝试过,在这两种情况下它都退出了应用程序。还有什么建议吗?
      • stageEvent.ADDED_TO_STAGE 被触发之前不可用。这应该添加到应用程序的顶层(最好甚至不在视图中,而是在 Application 类本身中)。尝试将e.preventDefault() 添加到条件中。除此之外,我不确定为什么这不起作用
      • 我在“applicationComplete”事件的 ViewNavigatorApplication 中添加了监听器。还添加了“preventDefault()”,但问题仍然存在。不过感谢您的帮助。
      • 也许可以试试stage.addEventListener( KeyboardEvent.KEY_UP, backButtonHandler, false, 1, true );
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多