我正在尝试覆盖后退按键功能。当用户按下一次时,我希望它返回到前一个屏幕。但是,当长按后退键时(例如,两秒钟或更长时间),我想退出应用程序。
到目前为止,我已经在我的活动中覆盖了这两个方法:
@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
中完成所有操作并使用重复次数/毫秒来检测它?
答案 0 :(得分:13)
永远不会调用onKeyLongPress
的原因是你在onKeyDown
中返回true而没有告诉框架这可能是一个长按 - 导致KeyEvent停止其流经不同的事件处理程序
您需要做的是:
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 );
}
答案 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);
}