无聊的分享:点击EditText以外区域隐藏软键盘

1.前言

当我们在使用一个应用的搜索功能或者任何带有输入功能的控件时,如果想取消输入往往会点击外部空间,这个时候系统的软键盘就会自动收起,并且输入框也会清楚焦点,这样看上去很自然,其实使用EditText控件是没有这种效果的,本文章就如何实现上述效果提供一点小小的思路。

2.如何实现

当我们在Activity单纯的添加一个EditText时,点击吊起软键盘,这个时候再点击EditText外部区域会是这个样子的:

会发现,无论我们怎么点击外部区域软键盘都不会收起。所以要达到点击外部区域收起键盘效果需要我们自己添加方法去隐藏键盘:

重写dispatchTouchEvent

override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
    ev?.let {
        if (it.action == MotionEvent.ACTION_DOWN) {
            //如果现在取得焦点的View为EditText则进入判断
            currentFocus?.let { view ->
                if (view is EditText) {
                    if (!isInSide(view, ev) && isSoftInPutDisplayed()) {
                        hideSoftInPut(view)
                    }
                }
            }
        }
    }
    return super.dispatchTouchEvent(ev)
}

在Activity 中重写dispatchTouchEvent,对ACTION_DOWN事件做处理,使用getCurrentFocus()方法拿到当前获取焦点的View,判断其是否为EditText,若为EditText,则看当前软键盘是否展示(isSoftInPutDisplayed)并且点击坐标是否在EditText的外部区域(isInSide),满足条件则隐藏软键盘(hideSoftInPut)。

判断点击坐标是否在EditText内部

//判断点击坐标是否在EditText内部
private fun isInSide(currentFocus: View, ev: MotionEvent): Boolean {
    val location = intArrayOf(0, 0)
    //获取当前EditText坐标
    currentFocus.getLocationInWindow(location)
    //上下左右
    val left = location[0]
    val top = location[1]
    val right = left + currentFocus.width
    val bottom = top + currentFocus.height
    //点击坐标是否在其内部
    return (ev.x >= left && ev.x <= right && ev.y > top && ev.y < bottom)
}

定义一个数组location存储当前EditText坐标,计算出其边界,再用点击坐标(ev.x,ev.y)和边界做比较最终得出点击坐标是否在其内部。

来判断软键盘是否展示

private fun isSoftInPutDisplayed(): Boolean {
    return ViewCompat.getRootWindowInsets(window.decorView)
        ?.isVisible(WindowInsetsCompat.Type.ime()) ?: false
}

使用 WindowInsetsCompat类来判断当前状态下软键盘是否展示,WindowInsetsCompat是AndroidX库中的一个类,用于处理窗口插入(WindowInsets)的辅助类,可用于帮助开发者处理设备的系统UI变化,如状态栏、导航栏、软键盘等,给ViewCompat.getRootWindowInsets传入decorView拿到其实例,利用isVisible方法判断软键盘(WindowInsetsCompat.Type.ime())是否显示。

隐藏软键盘

private fun hideSoftInPut(currentFocus: View) {
    currentFocus.let {
        //清除焦点
        it.clearFocus()
        //关闭软键盘
        val imm = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(it.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
    }
}

首先要清除当前EditText的焦点,防止出现键盘收起但是焦点还在的情况:

最后是获取系统Service隐藏当前的键盘。

来看看最终的效果吧:

3.结尾

以上就是关于点击EditText外部区域隐藏软键盘并且清除焦点的实现方法,当然这只是其中的一种方式,如有不足请在评论区或私信指出,如果你们有更多的实现方法也欢迎在论区或私信留言捏❤️❤️

原作者:Otaku_尻男
原文链接: https://juejin.cn/post/7226248402798936119

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
在这里插入图片描述
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

全套视频资料:

一、面试合集

在这里插入图片描述
二、源码解析合集
在这里插入图片描述

三、开源框架合集
在这里插入图片描述
欢迎大家一键三连支持,若需要文中资料,直接点击文末CSDN官方认证微信卡片免费领取↓↓↓

猜你喜欢

转载自blog.csdn.net/Eqiqi/article/details/130413992