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文本框之外任何地方隐藏键盘的解决办法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!