效果图如下:
代码实现如下:
首先创建一个工具类InputMethodUtil
public class InputMethodUtil { //隐藏软键盘 public static boolean hideInputMethod(Activity activity, View view) { InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { return imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } return false; } }
之后在InputMethodActivity类中实现点击输入框以外的区域,实现隐藏软件盘的效果
public class InputMethodActivity extends AppCompatActivity { private EditText editText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_input_method); editText = findViewById(R.id.editText); //请求焦点 editText.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(editText, InputMethodManager.RESULT_SHOWN); } //处理触摸事件的分发 是从dispatchTouchEvent开始的 @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { //返回具有焦点的当前视图 View v = getCurrentFocus(); if (isShouldHideInput(v, ev)) { if (InputMethodUtil.hideInputMethod(this, v)) { return true; } } } return super.dispatchTouchEvent(ev); } private boolean isShouldHideInput(View v, MotionEvent ev) { if (v != null) { if (v instanceof EditText) { //命名一个元素为2个的整数数组 int[] leftTop = {0, 0}; //返回两个整数值,分别为X和Y,此X和Y表示此视图,在其屏幕中的坐标(以左上角为原点的坐标) v.getLocationInWindow(leftTop); int left = leftTop[0], top = leftTop[1], bottom = top + v.getHeight(), right = left + v.getWidth(); if (ev.getX() > left && ev.getX() < right && ev.getY() > top && ev.getY() < bottom) { //如果点击的是输入框的区域,则返回false return false; } else { return true; } } } return false; } }