/**网上这种方法很多,大都只是整篇的代码,这里只是个人对此方法的一些注释见解
* TODO 点击空白处软键盘消失
* @param ev
* @return
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {//触摸事件,监听对屏幕的触摸情况,
//ACTION_DOWN 按下 ACTION_MOVE 移动 ACTION_UP 离开
if (ev.getAction() == MotionEvent.ACTION_DOWN) {//判断手指是否按下
View v = getCurrentFocus();//获取当前的焦点
if (isShouldHideInput(v, ev)) {//判断软件盘是否隐藏 ,true为点击是输入框之外,隐藏软键盘
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)) {//java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例,这里也就是用来判断是否为输入框
int[] leftTop = {0, 0};
v.getLocationInWindow(leftTop);//获取在当前窗口内的绝对坐标,基于当前窗口的左上角,getLeft , getTop, getBottom, getRight, 这一组是获取相对在它父窗口里的坐标
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;
}
点击空白处软键盘消失详解
最新推荐文章于 2022-07-11 20:58:10 发布