Android系统本身并没有提供有效的方法可以监听键盘的显示和隐藏,常用的监听方法莫过于屏幕的可见区域高度,当高度变化超过一定值,一般认为是超过200像素,就说明有键盘的显示和隐藏操作。
fun Activity.observeKeyboardChange(onChange: (isShowing: Boolean) -> Unit) {
val rootView = this.window.decorView
val r = Rect()
var lastHeight = 0
rootView.viewTreeObserver.addOnGlobalLayoutListener {
rootView.getWindowVisibleDisplayFrame(r)
val height = r.height()
if (lastHeight == 0) {
lastHeight = height
} else {
val diff = lastHeight - height
if (diff > 200) {
onChange(true)
lastHeight = height
} else if (diff < -200) {
onChange(false)
lastHeight = height
}
}
}
}
EditText可以在xml中通过inputType="textMultiLine"来设置可以输入多行文字,通过imeOptions="actionDone"来设置键盘右下角按钮,有ACTION_DONE、ACTION_SEARCH、ACTION_SEND等常用设置。
但是呢,如果设置了inputType="textMultiLine",可以多行输入,此时的键盘右下角按钮就会默认为换行操作,设置的imeOptions属性就会失效。在网上寻找多番,终于找到了一种有效的使得inputType="textMultiLine"和imeOptions="actionDone"同时生效的方法。
首先,在xml里设置inputType="textMultiLine";
然后,通过代码设置imeOptions为actionDone。
et.imeOptions = EditorInfo.IME_ACTION_DONE
et.setRawInputType(InputType.TYPE_CLASS_TEXT)