Android中为什么我键盘按键没有抬起也会触发onKeyUp

当我按下一个按键不松手时,为什么也会触发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,则说明是硬件按键事件。
 

img


最近更新

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/245139
  • 这篇博客你也可以参考下:Android每个键的onKeyDown事件
  • 除此之外, 这篇博客: Android 一个自定义View需要实现哪些方法中的 6.2,onKeyUp(int, KeyEvent) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 硬件按键启动事件发生时调用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;
    }
    

    这个方法主要是针对硬件按键(鼠标、键盘、遥控器)事件的,软件键盘上的按键通常不会触发该侦听器,尽管在某些情况下可能会选择这样做。但是不要依靠这个方法来捕捉软件按键事件。