为何KeyEvent的getRepeatCount方法始终返回0?
问题原因与解决方案
这个问题我之前调试时也踩过坑,其实是Android按键事件的处理逻辑和你预期的有差异,咱们来理清楚:
为什么getRepeatCount()始终返回0?
默认情况下,Android系统处理长按按键的流程是这样的:
- 用户按下按键:触发一次
onKeyDown,此时repeatCount为0 - 保持长按:经过系统预设的长按延迟后,触发
onKeyLongPress,但不会重复触发onKeyDown - 松开按键:触发
onKeyUp
也就是说,如果你没有主动开启按键跟踪,系统只会给你发一次onKeyDown事件,自然repeatCount永远是0。
怎么让长按触发重复的onKeyDown并正确获取repeatCount?
你需要在onKeyDown里做两个关键操作:
- 调用
event.startTracking():告诉系统开始跟踪这个按键事件,允许后续发送重复的按键事件 - 返回
true:表示你接管了这个事件的处理,让系统继续发送重复的onKeyDown(而不是交给默认的父类处理)
修改后的代码示例:
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { Log.i("key pressed", event.getKeyCode() + " - " + event.getRepeatCount()); // 开启按键跟踪,开启后系统才会在长按期间重复发送onKeyDown事件 event.startTracking(); // 返回true,告诉系统我们处理了这个事件,继续触发重复事件 return true; }
额外说明
如果同时需要处理长按的逻辑,可以重写onKeyLongPress方法,它会在第一次onKeyDown之后、重复onKeyDown之前触发:
@Override public boolean onKeyLongPress(int keyCode, KeyEvent event) { Log.i("key long press", "Long press detected for key: " + keyCode); return true; }
原来的代码里你返回了super.onKeyDown(keyCode, event),默认的父类实现不会开启按键跟踪,所以系统不会发送重复事件,这就是问题的核心啦。
内容的提问来源于stack exchange,提问作者Zyre
相关产品推荐
相关产品推荐

