如何区分长按键和常规按键?

时间:2011-11-22 12:24:41

标签: android onkeypress long-press

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

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

@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中完成所有操作并使用重复次数/毫秒来检测它?

3 个答案:

答案 0 :(得分:13)

永远不会调用onKeyLongPress的原因是你在onKeyDown中返回true而没有告诉框架这可能是一个长按 - 导致KeyEvent停止其流经不同的事件处理程序

您需要做的是:

  1. 在您返回true之前,请按documentation
  2. 中的说明致电event.startTracking()
  3. onKeyLongPress
  4. 处理长按

    实施如下,它将起作用:

      @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 );
      }
    

答案 1 :(得分:2)

为什么不使用onKeyUp()以及onKeyDown()?在onKeyDown()期间,您不知道是否是长按,因为只要按下该键就会调用该按键,并且您不知道用户打算将该按键保持多长时间。正如KasperMoerch正确说明的那样,您需要在startTracking方法中调用onKeyDown(),然后返回true。然后在onKeyUp() event.isTracking()中,您可以拨打event.isLongPress()和{{1}}来确定是按长按还是短按来处理。

答案 2 :(得分: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);
}