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)
在需要注銷此事件時執(zhí)行:
view.viewTreeObserver.removeOnGlobalLayoutListener(layoutListener)
此方法存在的問題:
-
keypadHeight > screenHeight / 4
不一定適用所有場景 - 帶有副作用,其它布局變化也可能滿足
keypadHeight > screenHeight / 4
因此徙瓶,最好是再添加一個 flag椰拒,在鍵盤彈出前將其置為 true
。
if (isWillShowKeyboard && keypadHeight > screenHeight / 4) {
isWillShowKeyboard = false
doSomethingWhenKeyboardShowed()
}