在 Android 开发中 , 遇到隐藏键盘的需求 , 通常是传递 EditText
给 InputMethodManager
进行键盘的关闭 . 如界面有多个输入框时 , 就需要保持它们的引用 . 而当在当前页有一些对话框 , 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