输入法引起的显示问题
Background:今天在开发时遇到了一个小问题,点击EditText弹出的输入法,在我点击其他控件时没有消失,影响了其他控件的显示。
solution: 重写Activity的dispatchTouchEvent方法,拦截Touch事件,判断是否点击控件是否为EditText。如果不是,那么就隐藏输入法。
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
// 拦截ACTION_DOWN事件,判断是否需要隐藏输入法
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View view = getCurrentFocus();
if (isShouldHideInput(view, ev)) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
return super.dispatchTouchEvent(ev);
}
// 交由DecorView去做Touch事件的分发
if (getWindow().superDispatchTouchEvent(ev)) {
return true;
}
// Activity内没有View对这个Touch事件做处理,那么有Activity来处理
return onTouchEvent(ev);
}
private boolean isShouldHideInput(View view, MotionEvent ev) {
\\ 1、判断是否是EditText,如果不是,直接返回false
if (view != null && (view instanceof EditText)) {
int[] location = {0, 0};
view.getLocationOnScreen(location);
int left = location[0];
int top = location[1];
\\ 2、判断Touch的点是否在EditText外
if (ev.getX() < left || (ev.getX() > left + view.getWidth())
|| ev.getY() < top || (ev.getY() > top + view.getHeight())) {
return true;
} else {
return false;
}
}
return false;
}
reference: https://blog.csdn.net/h649305597/article/details/53519320
知识点:Touch事件的分发处理
https://blog.csdn.net/carson_ho/article/details/54136311
网友评论