1.前言

当咱们在运用一个运用的搜索功用或许任何带有输入功用的控件时,假如想撤销输入往往会点击外部空间,这个时分系统的软键盘就会自动收起,而且输入框也会清楚焦点,这样看上去很天然,其实运用EditText控件是没有这种作用的,本文章就怎样完成上述作用供给一点小小的思路。

2.怎样完成

当咱们在Activity单纯的增加一个EditText时,点击吊起软键盘,这个时分再点击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的焦点,防止出现键盘收起可是焦点还在的状况:

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

最后是获取系统Service躲藏当时的键盘。

来看看终究的作用吧:

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

3.结束

以上便是关于点击EditText外部区域躲藏软键盘而且铲除焦点的完成办法,当然这只是其中的一种方式,如有不足请在评论区或私信指出,假如你们有更多的完成办法也欢迎在论区或私信留言捏❤️❤️