我在试着取消按键的功能。当用户按下一次时,我希望它回到上一个屏幕。但是,当长时间按下back键(比方说,两秒钟或更长时间)时,我想退出应用程序。
到目前为止,我已经在活动中重写了这两个方法:

@Override
public boolean onKeyDown( int keyCode, KeyEvent event){
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        //manage short keypress
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

@Override
public boolean onKeyLongPress( int keyCode, KeyEvent event){
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        //manage long keypress (different code than short one)
        return true;
    }
    return super.onKeyLongPress(keyCode, event);
}

但从不调用onKeyLongPress回调,因为事件总是由onKeyDown方法接收。
这两种方法都有效吗?或者必须在onKeyDown中全部完成并使用重复次数/毫秒来检测它?

最佳答案

从未调用onKeyLongPress的原因是,您在onKeyDown中返回true,而没有告诉框架这可能是一个长按-导致keyevent停止其通过不同事件处理程序的流。
你需要做的是:
在返回true之前,请按documentation中的说明调用event.startTracking()
处理长压入onKeyLongPress
按以下步骤实施,它将起作用:

  @Override
  public boolean onKeyDown( int keyCode, KeyEvent event ) {
    if( keyCode == KeyEvent.KEYCODE_BACK ) {
      event.startTracking();
      return true;
    }
    return super.onKeyDown( keyCode, event );
  }

  @Override
  public boolean onKeyUp( int keyCode, KeyEvent event ) {
    if( keyCode == KeyEvent.KEYCODE_BACK ) {
      //Handle what you want on short press.
      return true;
    }

    return super.onKeyUp( keyCode, event );
  }

  @Override
  public boolean onKeyLongPress( int keyCode, KeyEvent event ) {
    if( keyCode == KeyEvent.KEYCODE_BACK ) {
      //Handle what you want in long press.
      return true;
    }
    return super.onKeyLongPress( keyCode, event );
  }

08-18 08:35