在 Android 开发中 , 遇到隐藏键盘的需求 , 通常是传递 EditTextInputMethodManager 进行键盘的关闭 . 如界面有多个输入框时 , 就需要保持它们的引用 . 而当在当前页有一些对话框 , BottomSheetDialog 等时保持引用就不是一个好的办法 .

还有一种场景就是 iOS 设备中 , 点击键盘意外的区域 , 键盘自动回收隐藏 . 这里简单说明一种方法解决以上两种场景.

首先在需要在对应的界面覆写事件 , 通常是基类 BaseActivity

1
2
3
4
5
6
7
8
9
10
11
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View view = getCurrentFocus();
if (KeyboardUtils.isHideInput(view, ev)) {
KeyboardUtils.hideSoftInput(mContext,view.getWindowToken());
}
mBinding.getRoot().requestFocus();
}
return super.dispatchTouchEvent(ev);
}

KeyboardUtils.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 判定是否需要隐藏
public static boolean isHideInput(View v, MotionEvent ev) {
if (v != null && (v instanceof EditText)) {
int[] l = {0, 0};
v.getLocationInWindow(l);
int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left
+ v.getWidth();
if (ev.getX() > left && ev.getX() < right && ev.getY() > top
&& ev.getY() < bottom) {
return false;
} else {
return true;
}
}
return false;
}

// 隐藏软键盘
public static void hideSoftInput(Context context, IBinder token) {
if (token != null) {
InputMethodManager manager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
manager.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
}
}

参考链接

CSDN