重写Activity的dispatchTouchEvent方法
mBottomSend为底部输入框布局
override fun dispatchTouchEvent(event: MotionEvent?): Boolean {
event?.let {
if (it.action == MotionEvent.ACTION_DOWN) {
//判断当前页面是否已经弹出了软键盘
if (isKeyBoardShowing(context, mBottomSend)) {
var locations = intArrayOf(0, 0)
//计算输入框距离屏幕左侧和顶部的距离
mBottomSend.getLocationInWindow(locations)
val left = locations[0]
val top = locations[1]
val bottom = top + mBottomSend.height //输入框底部距离屏幕顶部距离
val right = left + mBottomSend.width //输入框右侧距离屏幕左侧的距离
val rect = Rect(left, top, right, bottom)
//如果点击的位置不在输入框内,则隐藏底部的软键盘
if (!rect.contains(it.x.toInt(), it.y.toInt())) {
hideKeyBoard(context, mBottomSend)
}
}
}
}
return super.dispatchTouchEvent(event)
}
/**
* 隐藏软键盘
*/
fun hideKeyBoard(context: Context, view: View) {
val input = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
if (input.isActive()) {
input.hideSoftInputFromWindow(view.getWindowToken(), 0)
}
}
/**
* 判断软键盘是否弹出
*/
fun isKeyBoardShowing(context: Context, v: View): Boolean {
val imm = context.getSystemService(context.INPUT_METHOD_SERVICE) as InputMethodManager
if (imm.hideSoftInputFromWindow(v.getWindowToken(), 0)) {
imm.showSoftInput(v, 0)
return true
//软键盘已弹出
} else {
return false
//软键盘未弹出
}
}