无法捕获Android返回按钮事件

5
我想捕获Android上的返回按钮事件。我知道关于这个问题在论坛上已经有很多了,但是我的代码不像给出的例子那样奏效。以下是我用来捕获事件的代码片段:
@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中没有显示任何事件触发的输出。有人知道可能的原因吗?

谢谢。


1
在测试之前添加一个日志,以确保您进入了该方法。如果没有,请确保您的视图是当前聚焦的视图。否则,它将无法获取onKey事件。 - ol_v_er
在第一个示例中,按下返回按钮时,是否发生默认行为? - Thomas Williams
6个回答

17

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


3
真的吗?这很奇怪,你是在普通的Activity中进行操作,但什么也没有显示出来?也许可以尝试在按下返回键时显示一个toast,以确保你的调试器没有问题。 - Brian

8

为了接收键盘事件,一个视图必须获得焦点。可以使用以下方法强制实现:

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

2
软键盘是否显示?该视图将首先捕获返回键以关闭它,然后才能由您自己的代码处理。

我正在尝试使用返回键来关闭自己的自定义键盘。 - coder
1
虽然有些晚了,但对于其他遇到这个问题的人来说,https://dev59.com/mG865IYBdhLWcg3wLrlE 可能非常有用,以防标准的Activity#onBackPressed()方法不起作用。 - qix

1
我的情况可能有些不同寻常,但我的行为方式完全相同,所以我想与大家分享!原因是在我的Activity的onResume()事件中,我启动了另一个Activity。那个Activity在显示任何UI之前就结束了,但这意味着每当子Activity完成时,我的主Activity的“onResume”都会被不断调用,并且所有的返回按钮事件似乎都消失在子Activity中。

1

这对我有效

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)。因此,请务必仔细检查您是否已经清理了项目。

-1

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

/**
   * 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接