【问题标题】:Not able to catch android back button event无法捕获 android 后退按钮事件
【发布时间】:2011-11-16 21:03:21
【问题描述】:

我正在尝试捕捉 Android 的后退按钮事件。我知道表格上已经有很多关于此的内容,但是,我的代码不能像给出的示例那样工作。这是我的代码 sn-p 来捕获事件:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event){
    if(keyCode == KeyEvent.KEYCODE_BACK){
        Log.d(TAG, "back key captured");
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

我也试过这个:

@Override
public void onBackPressed(){
    Log.d(TAG, "in onBackPressed");
    finish();
}

LogCat 的任何一个事件被触发的输出都不会显示。有人知道这可能的原因吗?

谢谢。

【问题讨论】:

  • 首先在您的测试之前添加一个日志,以确保您进入该方法。如果没有,请确保您的视图是当前关注的视图。如果没有,它不会得到 onKey 事件。
  • 在第一个例子中,当按下返回按钮时,是否会出现默认行为?

标签: android button back-button keyevent


【解决方案1】:

另一种方法是覆盖public void onBackPressed() 方法。这样做更直接、更容易。

【讨论】:

  • 真的吗?这很奇怪,您是从普通的 Activity 中执行此操作而根本没有出现任何内容?也许尝试让它在按下后退按钮时显示吐司只是为了仔细检查你的调试器没有问题。
【解决方案2】:

要接收键盘事件,视图必须具有焦点。强制使用:

view.setFocusableInTouchMode(True);
view.requestFocus();

【讨论】:

    【解决方案3】:

    软键盘是否显示?该视图将首先捕获返回键以在您自己的代码处理它之前将其关闭。

    【讨论】:

    • 我实际上是在尝试使用返回键来关闭自己的自定义键盘
    • 晚了,但对于任何偶然发现这个问题的人来说,stackoverflow.com/questions/3940127/… 可能非常有用,以防标准的 Activity#onBackPressed() 方法不起作用。
    【解决方案4】:

    这对我有用

    private long lastBackPressTime = 0;
        @Override
    public void onBackPressed() {
        if (this.lastBackPressTime < System.currentTimeMillis() - 4000) {
            Toast.makeText(this, R.string.backButtonWarning, 4000).show();
            this.lastBackPressTime = System.currentTimeMillis();
        } else {
            super.onBackPressed();
        }
    }
    

    最近由于 ADT 插件,我一直在尝试大量问题,该插件不会生成适当的资源文件 (R)。所以仔细检查你是否清理了你的项目

    【讨论】:

      【解决方案5】:

      我的情况可能不寻常,但我的行为完全相同,所以我想我会与全班分享!原因最终是在我的 onResume() Activity 事件中,我开始了另一个活动。该活动在显示任何 UI 之前就自行结束了,但这意味着每当子活动完成时,我的主要活动的“onResume”就会不断被调用,并且后退按钮事件似乎都消失在子活动中。

      【讨论】:

        【解决方案6】:

        这是我实现处理后退键事件的方法。

        /**
           * onKeyDown method
           * 
           * Executes code depending on what keyCode is pressed.
           * 
           * @param int keyCode
           * @param KeyEvent
           *          event KeyEvent object
           * 
           * @return true if the code completes execution, false otherwise
           * 
           */
          @Override
          public boolean onKeyDown(int keyCode, KeyEvent event) {        
            switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
              Log.d(TAG, "back key captured");
        
              this.onBackPressed();
        
              //You could also use this.moveTaskToBack(true) to return to the Home screen
        
              return true;
        
            default:
              return super.onKeyDown(keyCode, event);
            }
          }// end onKeyDown
        

        【讨论】:

          猜你喜欢
          • 2018-10-31
          • 1970-01-01
          • 2012-04-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-13
          • 2012-06-04
          相关资源
          最近更新 更多