android 点击空白处收起键盘

android中点击非EditText区域收起键盘,使用过两种方法来实现:

方法1. 只能在Activity中使用,大多数能满足需求。比较推荐。

方法2. 可在任何地方使用。若某控件也需要设置setTouchListener,则需要注意重复设置造成前次的设置无效。


方法1. 重写Acitivity的方法 boolean  dispatchTouchEvent(MotionEvent ev) :(参考http://blog.csdn.net/sanjinxiong/article/details/9989517,谢谢~)

  1. public class HomeActivity extends Activity {  
  2.     ......  
  3.     @Override  
  4.     public boolean dispatchTouchEvent(MotionEvent ev) {  
  5.         if (ev.getAction() == MotionEvent.ACTION_DOWN) {  
  6.   
  7.             // 获得当前得到焦点的View,一般情况下就是EditText(特殊情况就是轨迹求或者实体案件会移动焦点)  
  8.             View v = getCurrentFocus();  
  9.   
  10.             if (isShouldHideInput(v, ev)) {  
  11.                 hideSoftInput(v.getWindowToken());  
  12.             }  
  13.         }  
  14.         return super.dispatchTouchEvent(ev);  
  15.     }  
  16.   
  17.     /** 
  18.      * 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时没必要隐藏 
  19.      *  
  20.      * @param v 
  21.      * @param event 
  22.      * @return 
  23.      */  
  24.     private boolean isShouldHideInput(View v, MotionEvent event) {  
  25.         if (v != null && (v instanceof EditText)) {  
  26.             int[] l = { 00 };  
  27.             v.getLocationInWindow(l);  
  28.             int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left  
  29.                     + v.getWidth();  
  30.             if (event.getX() > left && event.getX() < right  
  31.                     && event.getY() > top && event.getY() < bottom) {  
  32.                 // 点击EditText的事件,忽略它。  
  33.                 return false;  
  34.             } else {  
  35.                 return true;  
  36.             }  
  37.         }  
  38.         // 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditView上,和用户用轨迹球选择其他的焦点  
  39.         return false;  
  40.     }  
  41.   
  42.     /** 
  43.      * 多种隐藏软件盘方法的其中一种 
  44.      *  
  45.      * @param token 
  46.      */  
  47.     private void hideSoftInput(IBinder token) {  
  48.         if (token != null) {  
  49.             InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
  50.             im.hideSoftInputFromWindow(token,  
  51.                     InputMethodManager.HIDE_NOT_ALWAYS);  
  52.         }  
  53.     }  
  54.   ......  
  55. }  

在isShouldHideInput中不应该使用event.getX()函数,而是应该用event.getRawX()函数


[java]  view plain  copy
  1. public final float getRawX ()   
  2. Added in API level 1  
  3. Returns the original raw X coordinate of this event. For touch events on the screen, this is the original location of the event on the screen, before it had been adjusted for the containing window and views.  

这个是相对于屏幕左上角的点


[java]  view plain  copy
  1. public final float getX ()   
  2. Added in API level 1  
  3. getX(intfor the first pointer index (may be an arbitrary pointer identifier).  
这个是触摸点相对于该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);
        }
    }
}


你可能感兴趣的:(Android)