实现思路:通过 dispatchTouchEvent 每次 ACTION_DOWN 事件中动态判断非 EditText 本身区域的点击事件,然后在事件中进行屏蔽。
@Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { getWindow().getDecorView().postDelayed(() -> { View view = getCurrentFocus(); if (isShouldHideInput(view, ev)) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { imm.hideSoftInputFromWindow(view.getWindowToken(), 0); view.clearFocus(); } } }, 100); } return super.dispatchTouchEvent(ev); } private boolean isShouldHideInput(View v, MotionEvent event) { if (v instanceof EditText) { int[] leftTop = new int[]{0, 0}; //获取输入框当前的location位置 v.getLocationInWindow(leftTop); int left = leftTop[0]; int top = leftTop[1]; int bottom = top + v.getHeight(); int right = left + v.getWidth(); return !(event.getRawX() > left && event.getRawX() < right && event.getRawY() > top && event.getRawY() < bottom); } return false; }
参考链接: