Android 没有提供软键盘相关的事件,因此需要通过其它方式实现。在 StackOverflow 找到的普遍认同的解决方案是重新实现 ViewTreeObserver.OnGlobalLayoutListener
,代码如下:
class MyGlobalLayoutListener : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
val r = Rect()
view.rootView.getWindowVisibleDisplayFrame(r)
val screenHeight = view.rootView.height
val keypadHeight = screenHeight - (r.bottom - r.top)
if (keypadHeight > screenHeight / 4) {
doSomethingWhenKeyboardShowed()
}
}
}
在 Activity.onCreate
或 Fragment.onActivityCreated
中添加类似下面的代码:
layoutListener = MyGlobalLayoutListener()
view.viewTreeObserver.addOnGlobalLayoutListener(layoutListener)
在需要注销此事件时执行:
view.viewTreeObserver.removeOnGlobalLayoutListener(layoutListener)
此方法存在的问题:
-
keypadHeight > screenHeight / 4
不一定适用所有场景 - 带有副作用,其它布局变化也可能满足
keypadHeight > screenHeight / 4
因此,最好是再添加一个 flag,在键盘弹出前将其置为 true
。
if (isWillShowKeyboard && keypadHeight > screenHeight / 4) {
isWillShowKeyboard = false
doSomethingWhenKeyboardShowed()
}
网友评论