版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010214991/article/details/48345887
前面我写了一篇文章,题目为”如何将编辑框EditText置于系统软键盘之上及相关细节的实现“,并且在代码中介绍了使用复写onTouchEvent(MotionEvent event)方法来实现点击编辑框EditText以外界面无法隐藏软键盘的解决方法,但事实上,该方法并不总是有效,特别是在复杂的布局中往往会失效,因此特给大家分享一个比较给力的方法,那就是添加如下代码:
<pre name="code" class="java"> @Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View v = getCurrentFocus();
if (isShouldHideInput(v, ev)) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
return super.dispatchTouchEvent(ev);
}
// 必不可少,否则所有的组件都不会有TouchEvent了
if (getWindow().superDispatchTouchEvent(ev)) {
return true;
}
return onTouchEvent(ev);
}
public boolean isShouldHideInput(View v, MotionEvent event) {
if (v != null && (v instanceof EditText)) {
int[] leftTop = { 0, 0 };
//获取输入框当前的location位置
v.getLocationInWindow(leftTop);
int left = leftTop[0];
int top = leftTop[1];
int bottom = top + v.getHeight();
int right = left + v.getWidth();
if (event.getX() > left && event.getX() < right && event.getY() > top && event.getY() < bottom) {
// 点击的是输入框区域,保留点击EditText的事件
return false;
} else {
return true;
}
}
return false;
}
这里有一点细节值得注意,如果你的输入框所在布局里面除了EditText外,还有其它东西。比如你的发送按钮跟编辑框同在一个布局并且在编辑框的右边,大家都知道,我们都希望在编辑框什么都不输入时点击发送按钮提示消息为空,要求用户再次输入,而不是点完按钮就直接隐藏软键盘,这显然不符合。因此上面的isShouldHideInput方法要稍微作下调整,如下:
public boolean isShouldHideInput(View v, MotionEvent event) {
if (v != null && (v instanceof EditText)) {
int[] leftTop = { 0, 0 };
//获取输入框当前的location位置
v.getLocationInWindow(leftTop);
int left = leftTop[0];
int top = leftTop[1];
int bottom = top + v.getHeight();
int right = left + v.getWidth();
//event.getX() > left && event.getX() < right
if (event.getY() > top && event.getY() < bottom) {
// 点击的是输入框区域,保留点击EditText的事件
return false;
} else {
return true;
}
}
return false;
}
大家看看修改后的代码,其实我就只是隐藏掉了event.getX() > left && event.getX() < right这句代码而已,意思是我们不再判断输入框的宽度(X轴)了,而仅仅是通过判断它的高度区域(Y轴)来控制点击区域外达到隐藏软键盘的效果,这样就不会出现同一布局高度内输入框右边发送按钮点击后软键盘隐藏的情况,这是一个小技巧。至于点击发送按钮隐藏软件盘,那是你发送非空消息后要才要做的事了,直接使用软键盘管理器来操作就行了,具体操作如下代码:
if(imm != null && imm.isActive()){
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);//发送成功则隐藏软键盘
}