在Android的开发中,会有要拦截按键的情况,例如拦截返回键,这是一个很简单的操作,只要在Activity中重写onBackPressed()方法,可以将方法体内直接为空实现,如下,或者做一些自己需要在按下返回键要做的操作。
@Override
public void onBackPressed() {
}
另外就是重写onKeyDown()方法
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK) {
return true; //屏蔽返回键
}
return super.onKeyDown(keyCode, event);
}
关于按键还有的就是dispatchKeyEvent()方法,因为dispatchKeyEvent和onKeyDown两个方法是有关联的,所以经过查资料我们可以知道,按键的时候不仅是有点击的一个操作,它还伴随着点击后,抬起的操作,当点击的时候,会触发dispatchKeyEvent,然后是onUserInteraction,最后onKeyDown。而按键随后抬起,顺序则是dispatchKeyEvent,onUserInteraction,onKeyUp。
在dispatchKeyEvent中,
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
//Log.e("PPP", event.getKeyCode()+"");
return super.dispatchKeyEvent(event);
}
当出发一次点击的时候Log会打印两次,就是有按下和抬起的操作都会触发。所以我们如果有需要重写dispatchKeyEvent的时候,应该在内部多做一次判断,按下还是抬起,如下,
if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
if(event.getAction() == KeyEvent.ACTION_DOWN) {
}
}
最后,dispatchKeyEvent和onKeyDown的返回值问题,如果我们重写了onKeyDown方法,如果想在执行完此方法后不再走系统的onKeyDown方法,则需要返回true,否则要返回false。而dispatchKeyEvent中,如果返回true,则也是代表事件被消费,不会继续传递,false则是可以继续响应onKeyDown方法。
由此,这两个方法比较值得注意的就是按键事件是分按下和抬起两种的,都会相应dispatchKeyEvent,并且这两个方法的返回值决定事件是否被消费掉。
转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/22053.html
微信打赏
支付宝打赏
感谢您对作者rick的打赏,我们会更加努力! 如果您想成为作者,请点我