1,Android Gridview中按键事件的处理有三个方法
public boolean onKeyDown(int keyCode, KeyEvent event)
public boolean onKeyUp(int keyCode, KeyEvent event)
public boolean onKeyLongPress(int keyCode, KeyEvent event)
很明显,长按事件是放到 onKeyLongPress 函数中来处理的。
GridView如果长按时,默认会先相应短按事件(GridView.setOnItemClickListener())的,而长按键事件的处理不应该放到(GridView.setOnLongClickListener())中,而应该放到 onKeyLongPress 函数中来处理,这样才能做到长按短按就能分开,如果一开始长按就相应长按,短按就相应短按,两者不会乱掉或者说干扰。
具体请看如下步骤:
第一步,先在 onKeyDown 函数中判断 event.getRepeatCount 的次数(实际上长按就是由一系列的onKeyDown事件触发的)
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
。。。。。。
if (event.getRepeatCount() == 0) {
event.startTracking();
return true;
}
return super.onKeyDown(keyCode, event);
}
如果一直按着不放,可以通过Log 查看onKeyDown 的event.getRepeatCount() 数目变化
第二步,重载 onKeyLongPressed 函数,在这个函数中你可以添加你的长按键事件的处理
@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
lockLongPressKey = true;
长按键事件的处理部分;
return true;
return super.onKeyLongPress(keyCode, event);
}
第三步,如果在onKeyUp 函数中也处理了相同的按键的话,那么需要对 onKeyLongPress 和 onKeyUp 中该按键的处理作互斥处理了
public boolean onKeyUp(int keyCode, KeyEvent event) {
if(lockLongPressKey){
lockLongPressKey = false;
return true;
}
return super.onKeyUp(keyCode, event);
}
互斥处理的原因是,长按事件处理完后,松开按键后就会执行 onKeyUp 函数。而这两处针对相同的按键想要实现的功能又不一样
固在此添加一个 private boolean lockLongPressKey = false; 变量,在 onKeyLongPress 函数中处理过以后,在 onKeyUp中便不再处理。