android中点击非EditText区域收起键盘,使用过两种方法来实现:
方法1. 只能在Activity中使用,大多数能满足需求。比较推荐。
方法2. 可在任何地方使用。若某控件也需要设置setTouchListener,则需要注意重复设置造成前次的设置无效。
方法1. 重写Acitivity的方法 boolean
dispatchTouchEvent(MotionEvent ev) :(参考http://blog.csdn.net/sanjinxiong/article/details/9989517,谢谢~)
- public class HomeActivity extends Activity {
- ......
- @Override
- public boolean dispatchTouchEvent(MotionEvent ev) {
- if (ev.getAction() == MotionEvent.ACTION_DOWN) {
- // 获得当前得到焦点的View,一般情况下就是EditText(特殊情况就是轨迹求或者实体案件会移动焦点)
- View v = getCurrentFocus();
- if (isShouldHideInput(v, ev)) {
- hideSoftInput(v.getWindowToken());
- }
- }
- return super.dispatchTouchEvent(ev);
- }
- /**
- * 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时没必要隐藏
- *
- * @param v
- * @param event
- * @return
- */
- private boolean isShouldHideInput(View v, MotionEvent event) {
- if (v != null && (v instanceof EditText)) {
- int[] l = { 0, 0 };
- v.getLocationInWindow(l);
- int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left
- + v.getWidth();
- if (event.getX() > left && event.getX() < right
- && event.getY() > top && event.getY() < bottom) {
- // 点击EditText的事件,忽略它。
- return false;
- } else {
- return true;
- }
- }
- // 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditView上,和用户用轨迹球选择其他的焦点
- return false;
- }
- /**
- * 多种隐藏软件盘方法的其中一种
- *
- * @param token
- */
- private void hideSoftInput(IBinder token) {
- if (token != null) {
- InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
- im.hideSoftInputFromWindow(token,
- InputMethodManager.HIDE_NOT_ALWAYS);
- }
- }
- ......
- }
在isShouldHideInput中不应该使用event.getX()函数,而是应该用event.getRawX()函数
这个是触摸点相对于该widget的坐标
如果还是不太清楚,可以看如下链接:
这个是相对于屏幕左上角的点
这个是触摸点相对于该widget的坐标
如果还是不太清楚,可以看如下链接:
http://www.360doc.com/content/13/0815/20/7179579_307418542.shtml这个讲的比较详细
方法2. 为每个控件设置 setTouchListener
/** * 点击EditText之外区域隐藏软键盘 * 实现方法:为除EditText之外的其他控件设置TouchListener * * @param view */ protected void setTouchListener(final View view) { if (view == null) { return; } if (!(view instanceof EditText)) { view.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { hideSoftInput(view); return false; } }); } if (view instanceof ViewGroup) { for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { View innerView = ((ViewGroup) view).getChildAt(i); setTouchListener(innerView); } } }