当我按下一个按键不松手时,为什么也会触发OnKeyUp函数
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (times == 0) log.d();
times++;
return true;
}
public boolean onKeyUp(int keyCode, KeyEvent event) {
times=0; return true;
}
这是因为按下一个按键时,系统会检测到KeyDown事件,并开始将KeyDown事件发送到应用程序。然后,如果继续按住该按键,系统将在一段时间后发送多个KeyDown事件,使得应用程序中的times增加。
这种情况是因为 Android 的按键事件分为两种类型:软件按键事件和硬件按键事件。硬件按键事件是由实际的物理按键触发的,而软件按键事件则是通过触摸屏幕等方式模拟的。
在你的代码中,重写了 onKeyUp 和 onKeyDown 两个方法来处理按键事件。当按下硬件按键时,按键事件会先进入 onKeyDown 方法中进行处理,然后再发送到 onKeyUp 方法中。
对于硬件按键事件,通常只有在按键被抬起时,才会触发 onKeyUp 方法。但是,在某些情况下,可能会发生按键没有抬起,但是仍然触发 onKeyUp 方法的情况。造成这种情况的原因可能是:
在 Android 系统中,硬件按键事件与重复按键事件共享同一个 KeyEvent 对象。因此,如果在按键没有抬起时,又重新按下同一个键,系统会认为这是一个重复按键事件,并触发 onKeyUp 方法。
如果你在 onKeyDown 方法中返回了 true,表示已经成功处理了按键事件,则系统可能会在接下来的重复按键事件中直接发送键盘释放事件,触发 onKeyUp 方法。
解决这种问题的方法是,可以在 onKeyDown 方法中判断当前是否为硬件按键事件,如果是,则将返回值设置为 false,表示系统将不会进一步处理这个事件,并防止重复按键事件触发 onKeyUp 方法。可以使用 event.getFlags() & KeyEvent.FLAG_FALLBACK 来判断是否为硬件按键事件,如果返回值是 0,则说明是硬件按键事件。
当硬件按键启动事件发生时调用KeyEvent.Callback#onKeyUp(int, KeyEvent)
。其默认实现:
/**
* 当`KeyEvent#KEYCODE_DPAD_CENTER`, `KeyEvent#KEYCODE_ENTER`或`KeyEvent#KEYCODE_SPACE`被释放时,执行视图的点击。
*
* @param keyCode A key code that represents the button pressed, from
* {@link android.view.KeyEvent}.
* @param event The KeyEvent object that defines the button action.
*/
public boolean onKeyUp(int keyCode, KeyEvent event) {
>>>
return false;
}
这个方法主要是针对硬件按键(鼠标、键盘、遥控器)事件的,软件键盘上的按键通常不会触发该侦听器,尽管在某些情况下可能会选择这样做。但是不要依靠这个方法来捕捉软件按键事件。