Android点击EditText以外隐藏输入法

输入法引起的显示问题

Background:今天在开发时遇到了一个小问题,点击EditText弹出的输入法,在我点击其他控件时没有消失,影响了其他控件的显示。
solution: 重写Activity的dispatchTouchEvent方法,拦截Touch事件,判断是否点击控件是否为EditText。如果不是,那么就隐藏输入法。

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        // 拦截ACTION_DOWN事件,判断是否需要隐藏输入法
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            View view = getCurrentFocus();
            if (isShouldHideInput(view, ev)) {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                if (imm != null) {
                    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
                }
            }
            return super.dispatchTouchEvent(ev);
        }

        // 交由DecorView去做Touch事件的分发
        if (getWindow().superDispatchTouchEvent(ev)) {
            return true;
        }

        // Activity内没有View对这个Touch事件做处理,那么有Activity来处理
        return onTouchEvent(ev);
    }
    private boolean isShouldHideInput(View view, MotionEvent ev) {
        \\ 1、判断是否是EditText,如果不是,直接返回false
        if (view != null && (view instanceof EditText)) {
            int[] location = {0, 0};
            view.getLocationOnScreen(location);
            int left = location[0];
            int top = location[1];

            \\ 2、判断Touch的点是否在EditText外
            if (ev.getX() < left || (ev.getX() > left + view.getWidth())
                    || ev.getY() < top || (ev.getY() > top + view.getHeight())) {
                return true;
            } else {
                return false;
            }
        }
        return false;
    }

reference: https://blog.csdn.net/h649305597/article/details/53519320

知识点:Touch事件的分发处理
https://blog.csdn.net/carson_ho/article/details/54136311

你可能感兴趣的:(Android点击EditText以外隐藏输入法)