【转】Android点击其他任意位置收起软键盘

转载自:Android点击其他任意位置收起软键盘


在Android应用开发中,经常出现这样的需求,用户在输入文字的过程中,可能不想继续输入了,通过滑动或者点击其他位置(除软键盘和EditText以外的任何位置),希望能够自动收回键盘,这个功能可能有些rom会自己实现了,但是大部分还是没有自己实现这个功能的,那么如果我们要自己实现,要如何解决呢?

首先,我们当然要先拦截其他任何的用户触摸屏幕的事件,通过重写Activity的boolean dispatchTouchEvent(MotionEvent ev);可是实现拦截用户的触摸事件。代码如下:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    DisplayUtils.hideInputWhenTouchOtherView(this, ev, getExcludeTouchHideInputViews());
    return super.dispatchTouchEvent(ev);
}


DisplayUtils.hideInputWhenTouchOtherView方法就是我们自己实现的当必要时候隐藏软键盘的代码了。关于hideInputWhenTouchOtherView的方法实现如下:

/**
 * 当点击其他View时隐藏软键盘
 *
 * @param activity
 * @param ev
 * @param excludeViews 点击这些View不会触发隐藏软键盘动作
 */
public static final void hideInputWhenTouchOtherView(Activity activity, MotionEvent ev, List<View> excludeViews) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        if (excludeViews != null && !excludeViews.isEmpty()) {
            for (int i = 0; i < excludeViews.size(); i++) {
                if (isTouchView(excludeViews.get(i), ev)) {
                    return;
                }
            }
        }
        View v = activity.getCurrentFocus();
        if (DisplayUtils.isShouldHideInput(v, ev)) {
            InputMethodManager inputMethodManager = (InputMethodManager)
                    activity.getSystemService(Context.INPUT_METHOD_SERVICE);
            if (inputMethodManager != null) {
                inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
            }
        }
    }
}

方法参数中的excludeViews表示点击这么View不会去试图隐藏软键盘,因为有些View的触摸事件我们有时候并不希望去隐藏软键盘,比如EditText的背景布局,聊天输入框的发送按钮等(如果摸一下发送按钮,键盘就收回去了岂不是很蛋疼)

可以看到,整个方法方法的实现过程就是通过判断触摸位置是属于哪个View,如果是需要排除的View,就直接不处理了.如果判断出来是点击了其他任意非EditText的View,就会隐藏软键盘。其他两个判断函数如下:

public static final boolean isTouchView(View view, MotionEvent event) {
    if (view == null || event == null) {
        return false;
    }
    int[] leftTop = {0, 0};
    view.getLocationInWindow(leftTop);
    int left = leftTop[0];
    int top = leftTop[1];
    int bottom = top + view.getHeight();
    int right = left + view.getWidth();
    if (event.getRawX() > left && event.getRawX() < right
            && event.getRawY() > top && event.getRawY() < bottom) {
        return true;
    }
    return false;
}

public static final boolean isShouldHideInput(View v, MotionEvent event) {
    if (v != null && (v instanceof EditText)) {
        return !isTouchView(v, event);
    }
    return false;
}

通过复用hideInputWhenTouchOtherView() 方法(甚至你可以在基类Activity里实现)就可以在任何Activity中以最少代码实现点击其他任意位置收起软键盘的功能了。如果代码有什么需要指正或者有更好的替代方案的,请大家及时告知哈。

发表评论