关于按键的响应

来源:互联网 发布:tc编程 编辑:程序博客网 时间:2024/05/17 23:42

一般的按键响应的拦截时重载一个onkeydown就可以了,像menu键之类的,onkeydown分为activity级别和view级别的,view级别只有在activity不响应而且view被聚焦的时候响应,但是search和音量钮之类的比较特别了,需要别的拦截的方式的,search好像有个onsearchRequested(),

    //重载放大镜调用
    public boolean onSearchRequested() {

       //TODO

        return true;
    }

 

 

回到主题,像音量钮值的要在dispatchkeyevent的时候进行拦截,这样,那个系统的音量提示框就不会出现了,

@Overridepublic boolean dispatchKeyEvent(KeyEvent event) {    int action = event.getAction();    int keyCode = event.getKeyCode();        switch (keyCode) {        case KeyEvent.KEYCODE_VOLUME_UP:            if (action == KeyEvent.ACTION_UP) {                //TODO            }            return true;        case KeyEvent.KEYCODE_VOLUME_DOWN:            if (action == KeyEvent.ACTION_UP) {                //TODO            }            return true;        default:            return super.dispatchKeyEvent(event);        }    }

 

后来发现弹出自己的dialog之后,音量钮的事件就接受不到了,原来被DialogInterface.OnKeyListener给没收了,所以要给自己的dialogsetkeylistener来继续处理事件(突然想起来dialog和activity是在同一个包下面的,而不是view在同一个包下面,有空要详细看看)

 

 

有些时候我们需要模拟一些按键的响应,可以直接调用onkeydown(keycode, keyevent),

还有一个方法是使用Instrumentation ,注意的是下面这两句不能再主线程中不调用

Instrumentation i = new Instrumentation();
i.sendKeyDownUpSync(KeyEvent.KEYCODE_A);

 

 

引用了的些资料来源于

http://stackoverflow.com/questions/2874743/android-volume-buttons-used-in-my-application

http://stackoverflow.com/questions/3830273/override-volume-key-in-android-in-pop-up-menus-notifications

原创粉丝点击