EditText失去焦点时,键盘收起的布局

最近做项目要求实现当点击edittext之外的view时,键盘收起的功能。google了一大堆,也没有什么思路,无奈自己写了一个。


实现原理很简单:

1.dispatchTouchEvent中获取点击事件坐标

2.根据坐标找到子view,判断子view,

    a.为空说明点击了空白处,收起键盘

    b.不为空,判断view是不是edittext,如果不是,收起键盘

代码:

public class EditFocusLayout extends LinearLayout {
    private final static String TAG = "EditFocusLayout";

    private Context mContext;
    public EditFocusLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        int x = (int) ev.getX();
        int y = (int) ev.getY();
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            View targetView = getTouchTargetView(this, x, y);
            InputMethodManager imm = (InputMethodManager)mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
            if (targetView == null) {//为空直接收起键盘
                imm.hideSoftInputFromWindow(this.getWindowToken(), 0);
            } else if (!(targetView instanceof EditText)){//不为edittext也收起键盘
                imm.hideSoftInputFromWindow(targetView.getWindowToken(), 0);
            }
        }
        return super.dispatchTouchEvent(ev);
    }

    /**
     * 获取点击到的view
     * @param viewGroup
     * @param x
     * @param y
     * @return
     */
    private View getTouchTargetView(ViewGroup viewGroup, int x, int y) {
        View touchView = null;
        for (int i = 0; i < viewGroup.getChildCount(); i ++) {
            View view = viewGroup.getChildAt(i);
            if (view instanceof ViewGroup) {
                View tempView = getTouchTargetView((ViewGroup) view, x, y);
                if (tempView != null) touchView = tempView;
            } else {
                if (isTouchPointInView(view, x, y)) touchView = view;
            }
        }
        return touchView;
    }

    private boolean isTouchPointInView(View view, int x, int y) {
        Rect rect = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
        return rect.contains(x, y);
    }
}

源码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值