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

分类:Android 9725人阅读 评论(8) 收藏 举报 空白区域输入框屏蔽 EditText 隐藏键盘



1,实现方法一:通过给当前界面布局文件的父layout设置点击事件(相当于给整个Activity设置点击事件),在事件里进行键盘隐藏

[java] view plain copy
  1. <LinearLayoutxmlns: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. </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. publicvoidonClick(Viewv){
  3. switch(v.getId()){
  4. caseR.id.traceroute_rootview:
  5. InputMethodManagerimm=(InputMethodManager)
  6. getSystemService(Context.INPUT_METHOD_SERVICE);
  7. imm.hideSoftInputFromWindow(v.getWindowToken(),0);
  8. break;
  9. }
  10. }

这样就可以完美的解决了输入框外的隐藏效果,对于布局不是特别复杂或是其它触摸事件少的情况下可以使用。


2,实现思路二:通过dispatchTouchEvent每次ACTION_DOWN事件中动态判断非EditText本身区域的点击事件,然后在事件中进行屏蔽。

[java] view plain copy
  1. @Override
  2. publicbooleandispatchTouchEvent(MotionEventev){
  3. if(ev.getAction()==MotionEvent.ACTION_DOWN){
  4. Viewv=getCurrentFocus();
  5. if(isShouldHideInput(v,ev)){
  6. InputMethodManagerimm=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
  7. if(imm!=null){
  8. imm.hideSoftInputFromWindow(v.getWindowToken(),0);
  9. }
  10. }
  11. returnsuper.dispatchTouchEvent(ev);
  12. }
  13. //必不可少,否则所有的组件都不会有TouchEvent了
  14. if(getWindow().superDispatchTouchEvent(ev)){
  15. returntrue;
  16. }
  17. returnonTouchEvent(ev);
  18. }

isShoudHideInput(View v,MotionEvent e)方法:

[java] view plain copy
  1. publicbooleanisShouldHideInput(Viewv,MotionEventevent){
  2. if(v!=null&&(vinstanceofEditText)){
  3. int[]leftTop={0,0};
  4. //获取输入框当前的location位置
  5. v.getLocationInWindow(leftTop);
  6. intleft=leftTop[0];
  7. inttop=leftTop[1];
  8. intbottom=top+v.getHeight();
  9. intright=left+v.getWidth();
  10. if(event.getX()>left&&event.getX()<right
  11. &&event.getY()>top&&event.getY()<bottom){
  12. //点击的是输入框区域,保留点击EditText的事件
  13. returnfalse;
  14. }else{
  15. returntrue;
  16. }
  17. }
  18. returnfalse;
  19. }
这种方法实现起来比较麻烦,解决思路与iOS中的事件分发机制是类似,对于处理隐藏事件比较清晰,通过层层事件分发,然后判断是否在需要屏蔽的区域。



版权声明:本文为博主原创文章,未经博主允许不得转载。

更多相关文章

  1. android事件拦截处理机制详解
  2. Android监听事件四种方法
  3. Android 事件分发详解及示例代码
  4. React Native嵌入到Android原生应用中、组件的生命周期、颜色、
  5. Android四种点击事件方法
  6. Android代码里或者XML设置android:clickable="false"无效。点击
  7. Android 按钮点击事件监听的3重方式
  8. Android BaseAdapter如何获得每一项并添加按钮事件
  9. Android OnTouchListener 触摸事件 & GestureDetector 手势识别

随机推荐

  1. 开源项目之Android(安卓)RibbonMenu(导航
  2. android studio 中使用fastjson
  3. android设备上视频只有声音没有图像
  4. 2011.06.23——— android 事件处理机制
  5. Android(安卓)SD
  6. Android(安卓)JNI 开启子线程后调用 Acti
  7. Android(安卓)dialog 全屏
  8. android中判断网络是否连接
  9. Android(安卓)sdk update
  10. Android关于自定义ExpandableListView样