Android键盘显示隐藏优化

本文介绍了一种通过监听触摸事件来自动控制键盘显示的方法。当触摸位置位于EditText内时,自动弹出键盘;反之则隐藏。文章提供了实现代码,并讨论了如何优化用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中有时会遇到这样一种需求,当使用EditText控件时,当用户点击时的坐标在EditText控件坐标范围内,则自动显示键盘;若不在,就隐藏键盘。这样可以提升用户体验。代码如下:

参考博客:https://juejin.im/post/59a898ff6fb9a0249d6182fc

 @Override
 public boolean dispatchTouchEvent(MotionEvent ev) {

        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            View v = getCurrentFocus();

            //如果不是落在EditText区域,则需要关闭输入法
            if (HideKeyboard(v, ev)) {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
            }
        }

        return super.dispatchTouchEvent(ev);

    }
 // 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘
 private boolean HideKeyboard(View view, MotionEvent event) {
        if (view != null && (view instanceof EditText)) {
            int[] location = { 0, 0 };
            view.getLocationInWindow(location);
            //获取现在拥有焦点的控件view的位置,即EditText
            int left = location[0], top = location[1], bottom = top + view.getHeight(), right = left + view.getWidth();
            //判断我们手指点击的区域是否落在EditText上面,如果不是,则返回true,否则返回false
            boolean isInEt = (event.getX() > left && event.getX() < right && event.getY() > top
                    && event.getY() < bottom);
            return !isInEt;
        }
        return false;
    }
这段代码可以直接在应用的BaseActivity中复写,具体思想就是判断用户的手指是否落在EditText范围内,若是则显示输入法,若不是则强制关闭输入法。
但是这样做有一个问题,若某个页面中有俩个EditText,我们点击第一个EditText,然后继续点击第二个EditText,就会出现一种情况。就是当点击完第一个接着点击第二个时,会出现输入法先隐藏再显示的情况,所以我们需要将检测事件MotionEvent.ACTION_DOWN改为MotionEvent.ACTION_UP,这样就完全提升用户体验了。

代码已经过测试,测试手机为MX4 Pro和OPPP R9m,目前没有发现问题。代码为:

 @Override
 public boolean dispatchTouchEvent(MotionEvent ev) {

        if (ev.getAction() == MotionEvent.ACTION_UP) {
            View v = getCurrentFocus();

            //如果不是落在EditText区域,则需要关闭输入法
            if (HideKeyboard(v, ev)) {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
            }
        }

        return super.dispatchTouchEvent(ev);

    }
// 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘
private boolean HideKeyboard(View view, MotionEvent event) {
        if (view != null && (view instanceof EditText)) {
            int[] location = { 0, 0 };
            view.getLocationInWindow(location);
            //获取现在拥有焦点的控件view的位置,即EditText
            int left = location[0], top = location[1], bottom = top + view.getHeight(), right = left + view.getWidth();
            //判断我们手指点击的区域是否落在EditText上面,如果不是,则返回true,否则返回false
            boolean isInEt = (event.getX() > left && event.getX() < right && event.getY() > top
                    && event.getY() < bottom);
            return !isInEt;
        }
        return false;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值