Android中點擊非EditText區(qū)域關(guān)閉軟鍵盤:
1. 重寫Activity中dispatchTouchEvent方法,計算觸摸點位置
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
if (ev?.action == MotionEvent.ACTION_DOWN) {
val v = currentFocus
if (v is EditText) {
val l = intArrayOf(0, 0)
v.getLocationInWindow(l)
onTouchEditText(ev.x > l[0]
&& ev.x < l[0] + v.getWidth()
&& ev.y > l[1]
&& ev.y < l[1] + v.getHeight())
}
}
return super.dispatchTouchEvent(ev)
}
private fun onTouchEditText(isTouchInEditText: Boolean) {
//TODO 觸摸點不在EditText內(nèi),關(guān)閉軟鍵盤
Toast.makeText(this,
if (isTouchInEditText) "點擊在輸入框內(nèi)" else "點擊在輸入框外",
Toast.LENGTH_SHORT).show()
}
比較推薦使用
2. 為布局根節(jié)點設(shè)置點擊事件
skill_touch_rootView.setOnClickListener { v ->
val imm = getSystemService(Context.INPUT_METHOD_SERVICE)
as InputMethodManager
imm.hideSoftInputFromWindow(v.windowToken, 0)
}
缺點:如果布局中其他控件設(shè)置了OnClickListener,則點擊該控件區(qū)域并不會關(guān)閉軟鍵盤。
如下圖(灰色為根布局,綠色為按鈕,白色為輸入框),則只有點擊灰色區(qū)域才能關(guān)閉軟鍵盤。

最后,附上個人測試所用的 SkillEditTouchActivity源碼~