对于遥控器、鼠标、手指或者其他按键事件来说是有按下down和放开up两种状态的,setOnKeyListener之所以执行两次就是因为down和up占用了,有个取巧的方法就是 KeyEvent.getAction() == KeyEvent.ACTION_DOWN或者KeyEvent.getAction()== KeyEvent.ACTION_UP的时候让他执行结束return true;而且其他的操作需要获取getKeyCode()事件,不是getAction()动作;
根据gridview控件的模型来写出的代码:如下
myapp_gridview.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View arg0, int arg1, KeyEvent arg2) {
// TODO Auto-generated method stub
if (arg2.getAction() == KeyEvent.KEYCODE_BACK) {
finish();
}
// else if (arg2.getAction() == KeyEvent.ACTION_DOWN) {
//
// }
else if (arg2.getAction() == KeyEvent.ACTION_UP) {
return true;
} else if (arg2.getKeyCode() == KeyEvent.KEYCODE_DPAD_RIGHT) {
} else if (arg2.getKeyCode() == KeyEvent.KEYCODE_DPAD_LEFT) {
} else if (arg2.getKeyCode() == KeyEvent.KEYCODE_DPAD_DOWN) {
} else if (arg2.getKeyCode() == KeyEvent.KEYCODE_DPAD_UP) {
}
return false;
}
});
这样你就可以执行上、下、左、右事件了,这有个问题就是back事件和ok事件也必须在这里执行(注:前提是gridview执行setonkeylistener事件),这样的话弊端很大,是的onkeydown事件无法执行,所以最好的解决办法是在onkeydown事件中执行这些业务就可以了;还是以gridview的事例来展示代码部分:如下:
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if (keyCode == KeyEvent.KEYCODE_BACK) {
finish();
} else if (myapp_gridview.isFocused()
&& keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
} else if (myapp_gridview.isFocused()
&& keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
} else if (myapp_gridview.isFocused()
&& keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
} else if (myapp_gridview.isFocused()
&& keyCode == KeyEvent.KEYCODE_DPAD_UP) {
}
return super.onKeyDown(keyCode, event);
}
这需要判断焦点是否在gridview上,然后在判断事件类型;由此可见只要焦点在其他控件上也可以执行他所需要的事件类型;
以上只是我浅显的见解,具体的onkeydown和setonkeylistener的区别还需要去查资料分析。以后有机会在补上他们的区别。