10

我正在尝试覆盖后退按键的功能。当用户按下它一次时,我希望它回到上一个屏幕。但是,当长按后退键时(比如说,两秒钟或更长时间),我想退出应用程序。

到目前为止,我已经在我的活动中覆盖了这两种方法:

@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并使用重复/毫秒数来检测它?

4

3 回答 3

17

从未调用的原因onKeyLongPress是,您在onKeyDown没有告诉框架这可能是长按的情况下返回 true - 导致 KeyEvent 停止其通过不同事件处理程序的流动。

你需要做的是:

  1. 在返回 true 之前,请按照文档event.startTracking()中的说明进行调用。
  2. 处理长按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 );
  }
于 2011-11-22T12:33:24.707 回答
2

为什么不使用onKeyUp()以及onKeyDown()?在onKeyDown()您不知道它是否是长按的过程中,因为一旦按下键就会调用它并且您不知道用户打算按住键多长时间。正如 KasperMoerch 正确所说,您需要调用startTracking您的onKeyDown()方法,然后返回true。然后在你的onKeyUp()你可以调用event.isTracking()event.isLongPress()确定是长按还是短按来处理事情。

于 2011-11-22T12:48:53.630 回答
2

我认为最好的处理方法就是这样。

我可以在这里看到的唯一缺点是,如果用户启用它,单击菜单按钮不会发出声音。也许有一种方法可以检查并使用它,或者调用默认行为。

代码:

private boolean _handledMenuButton=false;

@Override
public boolean onKeyUp(final int keyCode,final KeyEvent event) {
    switch(keyCode) {
        case KeyEvent.KEYCODE_MENU:
          if (!_handledMenuButton) {
              //Handle single clicking here
          }
          _handledMenuButton=false;
          return true;
    }
    return super.onKeyUp(keyCode,event);
}

@Override
public boolean onKeyLongPress(final int keyCode, final KeyEvent event) {
    switch(keyCode) {
        case KeyEvent.KEYCODE_MENU:
          //Handle long clicking here
          _handledMenuButton=true;
          return true;
    }
    return super.onKeyLongPress(keyCode,event);
}

@Override
public boolean onKeyDown(final int keyCode,final KeyEvent event) {
    switch(keyCode) {
        case KeyEvent.KEYCODE_MENU:
            _handledMenuButton=false;
            event.startTracking();
            return true;
    }
    return super.onKeyDown(keyCode,event);
}
于 2013-03-26T22:27:20.757 回答