【问题标题】:Adobe Flash AIR override Android back buttonAdobe Flash AIR 覆盖 Android 后退按钮
【发布时间】:2013-03-27 15:10:15
【问题描述】:

在我的 AIR AS3 应用程序中,我试图像这样覆盖后退按钮:

NativeApplication.nativeApplication.addEventListener( KeyboardEvent.KEY_DOWN, onKey );

private function onKey(e:KeyboardEvent):void 
{
    if (e.keyCode == Keyboard.BACK)
    {
        //stage.addChild(new MainMenuScreen());
        //stage.removeChild(this);
        //removeEventListener(KeyboardEvent.KEY_DOWN, onKey);
    }
}

在我看来,我的代码已经完成,但默认的 Android 行为(应用程序已关闭) 也会执行。
有人遇到过这个问题吗?

【问题讨论】:

标签: android actionscript-3 flash air adobe


【解决方案1】:

如果你想阻止应用关闭,你应该拦截EXITING事件:

NativeApplication.nativeApplication.addEventListener(Event.EXITING, exitHandler);

function exitHandler(event:Event):void
{
    event.preventDefault();
}

我想我应该补充一点,您可以手动关闭应用程序:

NativeApplication.nativeApplication.exit();

【讨论】:

    【解决方案2】:

    只是阻止默认操作(关闭应用程序),但确保您仍然允许应用程序在没有其他事情可做的情况下关闭(例如,通过使用readyToClose 变量):

    private function onKey(e:KeyboardEvent):void 
    {
        if(e.keyCode == Keyboard.BACK)
        {
            if(!readyToClose)
            {
                e.preventDefault();
    
                //stage.addChild(new MainMenuScreen());
                //stage.removeChild(this);
                //removeEventListener(KeyboardEvent.KEY_DOWN, onKey);
            }
        }
    }
    

    【讨论】:

    • 出于某种未知原因 e.preventDefault();好像不是我写的一样完全不行
    • 你试过没有if(!readyToClose) 等,看看它是否有效?
    • 谢谢。我已经找到了解决方案。这不是由于代码,而是由于 IDE。看我的回答
    【解决方案3】:

    感谢大家的帮助! 问题出在我的 FlashDevelop IDE 上。我使用了 PackageApp.bat 而不是 Run.bat,所以我的 .apk 的错误版本被部署到了设备上。希望这篇文章能帮助其他可能面临这个问题的人

    【讨论】:

      【解决方案4】:

      这是另一种方法 - 如果您使用多个阶段,您可以将其放在第一个操作面板的第 1 帧中

      NativeApplication.nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN, CheckKeypress, false, 0, true)
      
      function CheckKeypress(event:KeyboardEvent):void 
      { 
          switch (event.keyCode) 
          { 
              case Keyboard.BACK: 
              event.preventDefault();
              gotoAndPlay (1);
              break; 
              case Keyboard.MENU: 
              trace("Menu key is pressed.");
              break; 
              case Keyboard.SEARCH: 
              trace("Search key is pressed."); 
              break; 
              } 
              }
      

      【讨论】: