一般的按键响应的拦截时重载一个onkeydown就可以了,像menu键之类的,onkeydown分为activity级别和view级别的,view级别只有在activity不响应而且view被聚焦的时候响应,但是search和音量钮之类的比较特别了,需要别的拦截的方式的,search好像有个onsearchRequested(),
//重载放大镜调用
public boolean onSearchRequested() {
//TODO
return true;
}
回到主题,像音量钮值的要在dispatchkeyevent的时候进行拦截,这样,那个系统的音量提示框就不会出现了,
@Override
public 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