您的位置:首页 > 移动开发 > Android开发

android setOnKeyListener事件两次执行解决办法

2016-01-05 16:23 393 查看
对于遥控器、鼠标、手指或者其他按键事件来说是有按下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的区别还需要去查资料分析。以后有机会在补上他们的区别。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: