var editText: EditText? = scattered_num_et
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
if (ev.action == MotionEvent.ACTION_DOWN) {
val v = currentFocus
if (isShouldHideInput(v, ev)) { //点击editText控件外部
val imm: InputMethodManager =
mContext.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
if (imm != null) {
assert(v != null)
if (isShouldHideInput(data_change_kb,ev,false)) {
scattered_num_et.clearFocus()
}
// if (editText != null) {
// editText!!.clearFocus()
// }
}
}
return super.dispatchTouchEvent(ev)
}
return window!!.superDispatchTouchEvent(ev) || onTouchEvent(ev)
}
重写 dispatchTouchEvent 方法获取事件。
当需要触摸点击事件发生在指定View不清楚指定EditText不清除焦点时将View传
isShouldHideInput()方法并且模式为 type = false,
type = false为判断触摸点击事件是否发生在指定View所在范围内,
type = true为判断触摸点击事件是否发生在获取焦点EditText所在范围内。
private fun isShouldHideInput(v: View?, event: MotionEvent, type: Boolean ?= true): Boolean {
if (type == true) {
if (v != null && v is EditText) {
// editText = v
val leftTop = intArrayOf(0, 0)
//获取输入框当前的location位置
v.getLocationInWindow(leftTop)
val left = leftTop[0]
val top = leftTop[1]
val bottom = top + v.getHeight()
val right = left + v.getWidth()
return !(event.x > left && event.x < right && event.y > top && event.y < bottom)
}
}else {
if (v != null) {
// editText = v
val leftTop = intArrayOf(0, 0)
//获取输入框当前的location位置
v.getLocationInWindow(leftTop)
val left = leftTop[0]
val top = leftTop[1]
val bottom = top + v.height
val right = left + v.width
return !(event.x > left && event.x < right && event.y > top && event.y < bottom)
}
}
return false
}