Android点击空白处隐藏软键盘

首先声明下,以下内容主要参考自http://www.2cto.com/kf/201505/401382.html

由于部分代码实际使用过程中有些问题,做了部分更改,主要在方法2:

1. 一般直接使用如下方式即可

@Override
public boolean onTouchEvent(MotionEvent event) {

    if(event.getAction() == MotionEvent.ACTION_DOWN &&
    	getCurrentFocus()!=null && 
    	getCurrentFocus().getWindowToken()!=null ){

    	InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

    }
    
    return super.onTouchEvent(event);
}

2. 如果第一种方法没效果,可以在activity中加入(上面的就不要了)

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN  &&
            getCurrentFocus()!=null &&
            getCurrentFocus().getWindowToken()!=null) {

        View v = getCurrentFocus();
        if (isShouldHideKeyboard(v, event)) {
            hideKeyboard(v.getWindowToken());
        }
    }
    return super.dispatchTouchEvent(event);
}

/**
 * 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时则不能隐藏
 */
private boolean isShouldHideKeyboard(View v, MotionEvent event) {
    if (v != null && (v instanceof EditText)) {
        int[] l = {0, 0};
        v.getLocationOnScreen(l);
        int left = l[0],
                top = l[1],
                bottom = top + v.getHeight(),
                right = left + v.getWidth();
        if (event.getRawX() > left && event.getRawX() < right
                && event.getRawY() > top && event.getRawY() < bottom) {
            // 点击EditText的事件,忽略它。
            return false;
        } else {
            return true;
        }
    }
    // 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditText上,和用户用轨迹球选择其他的焦点
    return false;
}

/**
 * 获取InputMethodManager,隐藏软键盘
 */
private void hideKeyboard(IBinder token) {
    if (token != null) {
        InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

主要的改变在于

1)取点击event坐标的时候使用的是getRawX、getRawY,表示相对于屏幕的绝对坐标。

关于其他的方法见 http://blog.sina.com.cn/s/blog_5da93c8f0100tlol.html,但实际效果可能有差距,需自行测试。

2)获取EditText控件的坐标,使用了getLocationOnScreen,表示这个view左上角相对于屏幕的绝对坐标,getLocationInWindow 计算该视图在它所在的widnow的坐标x、y值,这个也自行测试吧...

猜你喜欢

转载自xuanzhui.iteye.com/blog/2246420