Android点击EditText文本框之外任何地方隐藏键盘的解决办法
1,实现方法一:
通过给当前界面布局文件的父layout设置点击事件(相当于给整个Activity设置点击事件),在事件里进行键盘隐藏
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/traceroute_rootview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/white" android:clickable="true" android:gravity="center_horizontal" android:orientation="vertical"> </LinearLayout>
加上id和clickable=true
然后在onCreate里,添加onClick事件的监听:
findViewById(R.id.traceroute_rootview).setOnClickListener(this);
在onClick中:
@Override publicvoidonClick(Viewv){ switch(v.getId()){ caseR.id.traceroute_rootview: InputMethodManagerimm=(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(),0); break; } }
这样就可以完美的解决了输入框外的隐藏效果,对于布局不是特别复杂或是其它触摸事件少的情况下可以使用。
2,实现思路二:
通过dispatchTouchEvent每次ACTION_DOWN事件中动态判断非EditText本身区域的点击事件,然后在事件中进行屏蔽。
@Override publicbooleandispatchTouchEvent(MotionEventev){ if(ev.getAction()==MotionEvent.ACTION_DOWN){ Viewv=getCurrentFocus(); if(isShouldHideInput(v,ev)){ InputMethodManagerimm=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); if(imm!=null){ imm.hideSoftInputFromWindow(v.getWindowToken(),0); } } returnsuper.dispatchTouchEvent(ev); } //必不可少,否则所有的组件都不会有TouchEvent了 if(getWindow().superDispatchTouchEvent(ev)){ returntrue; } returnonTouchEvent(ev); }
isShoudHideInput(Viewv,MotionEvente)方法:
publicbooleanisShouldHideInput(Viewv,MotionEventevent){ if(v!=null&&(vinstanceofEditText)){ int[]leftTop={0,0}; //获取输入框当前的location位置 v.getLocationInWindow(leftTop); intleft=leftTop[0]; inttop=leftTop[1]; intbottom=top+v.getHeight(); intright=left+v.getWidth(); if(event.getX()>left&&event.getX()<right &&event.getY()>top&&event.getY()<bottom){ //点击的是输入框区域,保留点击EditText的事件 returnfalse; }else{ returntrue; } } returnfalse; }
这种方法实现起来比较麻烦,解决思路与iOS中的事件分发机制是类似,对于处理隐藏事件比较清晰,通过层层事件分发,然后判断是否在需要屏蔽的区域。
1,实现方法一:
通过给当前界面布局文件的父layout设置点击事件(相当于给整个Activity设置点击事件),在事件里进行键盘隐藏
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/traceroute_rootview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/white" android:clickable="true" android:gravity="center_horizontal" android:orientation="vertical"> </LinearLayout>
加上id和clickable=true
然后在onCreate里,添加onClick事件的监听:
findViewById(R.id.traceroute_rootview).setOnClickListener(this);
在onClick中:
@Override publicvoidonClick(Viewv){ switch(v.getId()){ caseR.id.traceroute_rootview: InputMethodManagerimm=(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(),0); break; } }
这样就可以完美的解决了输入框外的隐藏效果,对于布局不是特别复杂或是其它触摸事件少的情况下可以使用。
2,实现思路二:
通过dispatchTouchEvent每次ACTION_DOWN事件中动态判断非EditText本身区域的点击事件,然后在事件中进行屏蔽。
@Override publicbooleandispatchTouchEvent(MotionEventev){ if(ev.getAction()==MotionEvent.ACTION_DOWN){ Viewv=getCurrentFocus(); if(isShouldHideInput(v,ev)){ InputMethodManagerimm=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); if(imm!=null){ imm.hideSoftInputFromWindow(v.getWindowToken(),0); } } returnsuper.dispatchTouchEvent(ev); } //必不可少,否则所有的组件都不会有TouchEvent了 if(getWindow().superDispatchTouchEvent(ev)){ returntrue; } returnonTouchEvent(ev); }
isShoudHideInput(Viewv,MotionEvente)方法:
publicbooleanisShouldHideInput(Viewv,MotionEventevent){ if(v!=null&&(vinstanceofEditText)){ int[]leftTop={0,0}; //获取输入框当前的location位置 v.getLocationInWindow(leftTop); intleft=leftTop[0]; inttop=leftTop[1]; intbottom=top+v.getHeight(); intright=left+v.getWidth(); if(event.getX()>left&&event.getX()<right &&event.getY()>top&&event.getY()<bottom){ //点击的是输入框区域,保留点击EditText的事件 returnfalse; }else{ returntrue; } } returnfalse; }
这种方法实现起来比较麻烦,解决思路与iOS中的事件分发机制是类似,对于处理隐藏事件比较清晰,通过层层事件分发,然后判断是否在需要屏蔽的区域。
以上所述是小编给大家介绍的Android点击EditText文本框之外任何地方隐藏键盘的解决办法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!