Android 探测软键盘弹出

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.onCreateFragment.onActivityCreated 中添加类似下面的代码:

layoutListener = MyGlobalLayoutListener()
view.viewTreeObserver.addOnGlobalLayoutListener(layoutListener)

在需要注销此事件时执行:

view.viewTreeObserver.removeOnGlobalLayoutListener(layoutListener)

此方法存在的问题:

  1. keypadHeight > screenHeight / 4 不一定适用所有场景
  2. 带有副作用,其它布局变化也可能满足 keypadHeight > screenHeight / 4

因此,最好是再添加一个 flag,在键盘弹出前将其置为 true

if (isWillShowKeyboard && keypadHeight > screenHeight / 4) {
  isWillShowKeyboard = false
  doSomethingWhenKeyboardShowed()
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容