最新消息:文章中包含代码时,请遵守代码高亮规范!

Android中的按键的分发处理【原创】

Android 李, 泰愚 117浏览 0评论

在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,并且这两个方法的返回值决定事件是否被消费掉。

转载时请注明出处及相应链接,本文永久地址:http://blog.it985.com/22053.html


pay_weixin
pay_weixin
微信打赏
pay_weixin
支付宝打赏
感谢您对作者rick的打赏,我们会更加努力!    如果您想成为作者,请点我

您必须 登录 才能发表评论!