Fragment里写在Activity中,好象这个最管用:
//隐藏软键盘 //在activity里面重写 dispatchTouchEvent @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { View v = getCurrentFocus(); if (isShouldHideInput(v, ev)) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } return super.dispatchTouchEvent(ev); } // 必不可少,否则所有的组件都不会有TouchEvent了 if (getWindow().superDispatchTouchEvent(ev)) { return true; } return onTouchEvent(ev); } /** * 是否隐藏键盘 */ public static boolean isShouldHideInput(View v, MotionEvent event) { if ((v instanceof EditText)) { int[] leftTop = {0, 0}; //获取输入框当前的location位置 v.getLocationInWindow(leftTop); int left = leftTop[0]; int top = leftTop[1]; int bottom = top + v.getHeight(); int right = left + v.getWidth(); // 点击的是输入框区域,保留点击EditText的事件 return !(event.getX() > left) || !(event.getX() < right) || !(event.getY() > top) || !(event.getY() < bottom); } return false; }
重写方法:
@Override public boolean onTouchEvent(MotionEvent event) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText_phone.getWindowToken(), 0); imm.hideSoftInputFromWindow(editText_phone.getWindowToken(), 0); return super.onTouchEvent(event); }
这个更直接,好理解(rootLayout为根布局):
/*点击键盘外隐藏软键盘*/ binding.rootLayout.setOnTouchListener(new View.OnTouchListener() { @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View v, MotionEvent event) { if(null!= requireActivity().getCurrentFocus()){ InputMethodManager manager= (InputMethodManager) requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE); if(manager!=null){ return manager.hideSoftInputFromWindow(requireActivity().getCurrentFocus().getWindowToken(),0); } } return false; } });