activity任意点击取消edittext输入框焦点

//事件分发方法重写
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    //如果是点击事件,获取点击的view,并判断是否要收起键盘
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        //获取目前得到焦点的view
        View v = getCurrentFocus();
        //判断是否要收起并进行处理
        if (isShouldHideKeyboard(v, ev)) {
            hideKeyboard(v.getWindowToken());
            v.clearFocus();
        }
    }
    //这个是activity的事件分发,一定要有,不然就不会有任何的点击事件了
    return super.dispatchTouchEvent(ev);
}

//判断是否要收起键盘
private boolean isShouldHideKeyboard(View v, MotionEvent event) {
    //如果目前得到焦点的这个view是editText的话进行判断点击的位置
    if (v instanceof EditText) {
        int[] l = {0, 0};
        v.getLocationInWindow(l);
        int left = l[0],
                top = l[1],
                bottom = top + v.getHeight(),
                right = left + v.getWidth();
        // 点击EditText的事件,忽略它。
        return !(event.getX() > left) || !(event.getX() < right)
                || !(event.getY() > top) || !(event.getY() < bottom);
    }
    // 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditText上
    return false;
}

//隐藏软键盘并让editText失去焦点
private void hideKeyboard(IBinder token) {
    if (token != null) {
        //这里先获取InputMethodManager再调用他的方法来关闭软键盘
        //InputMethodManager就是一个管理窗口输入的manager
        InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if (im != null) {
            im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }
}

protected void hideSoftKeyboard() {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0); //强制隐藏键盘
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值