首先声明下,以下内容主要参考自/kf/05/401382.html
由于部分代码实际使用过程中有些问题,做了部分更改,主要在方法2:
1. 一般直接使用如下方式即可
@Overridepublic boolean onTouchEvent(MotionEvent event) {if(event.getAction() == MotionEvent.ACTION_DOWN &&getCurrentFocus()!=null && getCurrentFocus().getWindowToken()!=null ){InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);}return super.onTouchEvent(event);}
2. 如果第一种方法没效果,可以在activity中加入(上面的就不要了)
@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_DOWN &&getCurrentFocus()!=null &&getCurrentFocus().getWindowToken()!=null) {View v = getCurrentFocus();if (isShouldHideKeyboard(v, event)) {hideKeyboard(v.getWindowToken());}}return super.dispatchTouchEvent(event);}/*** 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时则不能隐藏*/private boolean isShouldHideKeyboard(View v, MotionEvent event) {if (v != null && (v instanceof EditText)) {int[] l = {0, 0};v.getLocationOnScreen(l);int left = l[0],top = l[1],bottom = top + v.getHeight(),right = left + v.getWidth();if (event.getRawX() > left && event.getRawX() < right&& event.getRawY() > top && event.getRawY() < bottom) {// 点击EditText的事件,忽略它。return false;} else {return true;}}// 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditText上,和用户用轨迹球选择其他的焦点return false;}/*** 获取InputMethodManager,隐藏软键盘*/private void hideKeyboard(IBinder token) {if (token != null) {InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);inputMethodManager.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);}}
主要的改变在于
1)取点击event坐标的时候使用的是getRawX、getRawY,表示相对于屏幕的绝对坐标。
关于其他的方法见/s/blog_5da93c8f0100tlol.html,但实际效果可能有差距,需自行测试。
2)获取EditText控件的坐标,使用了getLocationOnScreen,表示这个view左上角相对于屏幕的绝对坐标,getLocationInWindow 计算该视图在它所在的widnow的坐标x、y值,这个也自行测试吧...
如果觉得《Android点击空白处隐藏软键盘》对你有帮助,请点赞、收藏,并留下你的观点哦!