点击edittext 区域外隐藏输入法和点击edittext 显示输入法

本文介绍如何在Android应用中实现EditText输入法的自动显示与隐藏功能。通过监听触摸事件来控制输入法的弹出,并在点击EditText以外的区域时隐藏输入法。此方法适用于包含EditText和ListView的布局。

在界面开发过程中,需要使用edittext来输入内容用来匹配查找,然后点击其他区域收起输入法。

本文在一个布局里有edittext 和一个list view ,edittext 输入内容,搜索list 里面的内容。然后点击其他区域后可以让输入法消失。

1.点击edittext 调出输入法键盘:

clearEditText 为继承exitText的编辑框。

监听touch事件,若点击了edittext,则获取焦点。

clearEditText.setOnTouchListener(clearEditTouchListener);

private View.OnTouchListener clearEditTouchListener = new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        clearEditText.setFocusable(true);
        clearEditText.setFocusableInTouchMode(true);
        return false;
    }
};

2. 点击edittext 区域外可以实现隐藏键盘。

    /**
     * 点击edittext 以外的区域edittext 会失去焦点
     *
     * @param ev
     * @return
     */
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            if (isEditTextArea(ev)) {   //确认是否为EditText区域,若不是,则返回true,隐藏输入法
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                if (null != imm) {
                    imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0); 
                }
            }
            return super.dispatchTouchEvent(ev);
        }
        if (getWindow().superDispatchTouchEvent(ev)) {
            return true;
        }
        return onTouchEvent(ev);
    }

    private boolean isEditTextArea(MotionEvent motionEvent) {
        View v = getCurrentFocus();  //获取当前焦点view
        if (null != v && (v instanceof EditText)) {  //若焦点view 为editText,则进行点击区域的判断
            int[] leftTop = {0, 0};
            v.getLocationInWindow(leftTop);  //获取屏幕中的位置
            int left = leftTop[0];
            int top = leftTop[1];
            int right = left + v.getWidth();
            int bottom = top + v.getHeight();
//            if (motionEvent.getX() > left && motionEvent.getX() < right
//                    && motionEvent.getY() > top && motionEvent.getY() < bottom) {
            if (motionEvent.getY() > top && motionEvent.getY() < bottom) { //点击区域是输入框的话就保留事件
                // 点击的是输入框区域,保留点击EditText的事件
                return false;
            } else { //
                clearEditText.setFocusableInTouchMode(false);
                clearEditText.setFocusable(false);
                return true;
            }
        }
        return false;
    }


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值