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