Android点击EditText文本框之外任何地方隐藏键盘的解决办法

卧疾丰暇豫,翰墨时间作。这篇文章主要讲述Android点击EditText文本框之外任何地方隐藏键盘的解决办法相关的知识,希望能为你提供帮助。
原文地址:  Android点击EditText文本框之外任何地方隐藏键盘的解决办法 
1,实现方法一:通过给当前界面布局文件的父layout设置点击事件(相当于给整个Activity设置点击事件),在事件里进行键盘隐藏
 
[java]  view plain  copy  

  1. < LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"   
  2.         android:id="@+id/traceroute_rootview"   
  3.         android:layout_width="fill_parent"   
  4.         android:layout_height="fill_parent"   
  5.         android:background="@color/white"   
  6.         android:clickable="true"   
  7.         android:gravity="center_horizontal"   
  8.         android:orientation="vertical"  >    
  9.    
  10. < /LinearLayout>    
加上id和clickable=true
 
然后在onCreate里,添加onClick事件的监听:
 
[java]  view plain  copy  
  1. findViewById(R.id.traceroute_rootview).setOnClickListener(this);    
在onClick中:
 
 
[java]  view plain  copy  
  1. @Override   
  2. public  void  onClick(View  v)  {   
  3.         switch  (v.getId())  {   
  4.         case  R.id.traceroute_rootview:   
  5.                   InputMethodManager  imm  =  (InputMethodManager)   
  6.                   getSystemService(Context.INPUT_METHOD_SERVICE);    
  7.                   imm.hideSoftInputFromWindow(v.getWindowToken(),  0);    
  8.                 break;    
  9.         }   
  10.    
  11. }   

这样就可以完美的解决了输入框外的隐藏效果,对于布局不是特别复杂或是其它触摸事件少的情况下可以使用。
 
 
2,实现思路二:通过dispatchTouchEvent每次ACTION_DOWN事件中动态判断非EditText本身区域的点击事件,然后在事件中进行屏蔽。
 
[java]  view plain  copy  
  1. @Override   
  2. public  boolean  dispatchTouchEvent(MotionEvent  ev)  {   
  3.         if  (ev.getAction()  ==  MotionEvent.ACTION_DOWN)  {   
  4.                 View  v  =  getCurrentFocus();    
  5.                 if  (isShouldHideInput(v,  ev))  {   
  6.    
  7.                         InputMethodManager  imm  =  (InputMethodManager)  getSystemService(Context.INPUT_METHOD_SERVICE);    
  8.                         if  (imm  !=  null)  {   
  9.                                 imm.hideSoftInputFromWindow(v.getWindowToken(),  0);    
  10.                         }   
  11.                 }   
  12.                 return  super.dispatchTouchEvent(ev);    
  13.         }   
  14.         //  必不可少,否则所有的组件都不会有TouchEvent了   
  15.         if  (getWindow().superDispatchTouchEvent(ev))  {   
  16.                 return  true;    
  17.         }   
  18.         return  onTouchEvent(ev);    
  19. }   

isShoudHideInput(View v,MotionEvent e)方法:
 
 
[java]  view plain  copy  
  1. public    boolean  isShouldHideInput(View  v,  MotionEvent  event)  {   
  2.         if  (v  !=  null  & &   (v  instanceof  EditText))  {   
  3.                 int[]  leftTop  =  {  0,  0  };    
  4.                 //获取输入框当前的location位置   
  5.                 v.getLocationInWindow(leftTop);    
  6.                 int  left  =  leftTop[0];    
  7.                 int  top  =  leftTop[1];    
  8.                 int  bottom  =  top  +  v.getHeight();    
  9.                 int  right  =  left  +  v.getWidth();    
  10.                 if  (event.getX()  >   left  & &   event.getX()  <   right   
  11.                                 & &   event.getY()  >   top  & &   event.getY()  <   bottom)  {   
  12.                         //  点击的是输入框区域,保留点击EditText的事件   
  13.                         return  false;    
  14.                 }  else  {   
  15.                         return  true;    
  16.                 }   
  17.         }   
  18.         return  false;    
  19. }   
【Android点击EditText文本框之外任何地方隐藏键盘的解决办法】这种方法实现起来比较麻烦,解决思路与ios中的事件分发机制是类似,对于处理隐藏事件比较清晰,通过层层事件分发,然后判断是否在需要屏蔽的区域。
 

    推荐阅读