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的区别还需要去查资料分析。以后有机会在补上他们的区别。
根据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的区别还需要去查资料分析。以后有机会在补上他们的区别。
相关文章推荐
- Android中Activity四种启动模式和taskAffinity属性详解
- Android学习笔记2
- android studio快捷键
- <h1>单元测试之android单元测试</h1>
- Android下setLatestEventInfo警告、Handler警告、SimpleDateFormat警告
- Android之进度条
- Android Studio 增加按钮响应事件
- android查看手机是否安装了打开某类附件的第三方应有 并用其打开附件
- android开发中怎么获取manifest.xml文件中(meta-data)的信息
- 7种形式的Android Dialog使用举例
- Android 四种基本的动画效果
- Android应用数字证书生成和签名
- Android开发使用的常见第三方框架汇总
- Android Studio Mac 常用快捷键
- Android 线程 thread的实现方法
- 【android】listview改变选中行背景图片
- 【第三节】android增量升级之提供服务端代码,整理项目
- android adb命令
- Java中的instanceof关键字在Android中的用法
- android Tools命名空间