在此做个笔记,防止遗忘,可能以后有需要。
先看下效果图
先讲解下思路:
首先在actviity里面获取到当前获取焦点的控件,判断当前控件是不是输入法弹起的那个EditText,然后再Activity的分发事件dispatchTouchEvent方法里面通过拿到点击的坐标位置,然后判断点击的坐标是否是点击的除EditText控件以外的部分就可以了,如果点击的EditText以外的位置则可以直接调用系统关闭键盘的方法即可,看代码吧。
Java版本
/**
重写dispatchTouchEvent
* 点击软键盘外面的区域关闭软键盘
* @param ev
* @return
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
// 获得当前得到焦点的View,
View v = getCurrentFocus();
if (isShouldHideInput(v, ev)) {
//根据判断关闭软键盘
InputMethodManager imm = (InputMethodManager)getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
return super.dispatchTouchEvent(ev);
}
/**
* 判断用户点击的区域是否是输入框
*
* @param v
* @param event
* @return
*/
private boolean isShouldHideInput(View v, MotionEvent event) {
if (v != null && (v instanceof EditText)) {
int[] l = { 0, 0 };
v.getLocationInWindow(l);
int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left
+ v.getWidth();
if (event.getX() > left && event.getX() < right
&& event.getY() > top && event.getY() < bottom) {
// 点击EditText的事件,忽略它。
return false;
} else {
return true;
}
}
return false;
}
Kotlin版本
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
if (ev!!.action == MotionEvent.ACTION_DOWN) {
val v = currentFocus
if (isShouldHideKeyboard(v, ev)) {
//根据判断关闭软键盘
SoftKeyboardUtils.hideKeyboard(v!!)
}
}
return super.dispatchTouchEvent(ev)
}
private fun isShouldHideKeyboard(v: View?, event: MotionEvent): Boolean {
if (v is EditText) {
val l = intArrayOf(0, 0)
v.getLocationOnScreen(l)
val left = l[0]
val top = l[1]
val bottom: Int = top + v.getHeight()
val right: Int = left + v.getWidth()
//下面减去100是减去的搜索框右边Button按钮的大小粗略估算的
return !(event.rawX > left && event.rawX - 100 < right && event.rawY > top && event.rawY < bottom)
}
return false
}
看下上面对应的工具类SoftKeyboardUtils.kt
import android.content.Context
import android.view.View
import android.view.inputmethod.InputMethodManager
import com.common.global.GlobalContext
/**
* 显示和关闭系统键盘的方法
* @author xiayiye5
* @date 2021/9/29 10:45
*/
object SoftKeyboardUtils {
private val imm: InputMethodManager =
GlobalContext.get().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
/**
* 关闭系统键盘的方法
*/
fun hideKeyboard(view: View) {
imm.hideSoftInputFromWindow(view.windowToken, 0)
}
/**
* 显示系统键盘的方法
*/
fun showKeyboard(view: View) {
imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}
}
非常感谢原博主:原博主直达