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; } });