Compose中快捷监听软键盘收起弹出状态方法

1,396 阅读1分钟

Compose中快捷监听软键盘收起弹出状态方法

非compose方法监听软键盘收起

在我们开发compose项目之前就有很多获取软键盘状态的方法,比如如下法1:

 fun getImeVisible(activity: Activity, callback: WindowsKeyboardCallback? = null) { //判断软键盘是否收起
        ViewCompat.setOnApplyWindowInsetsListener(activity.window.decorView) { _, insets ->
            val imeVisible = insets.isVisible(WindowInsetsCompat.Type.ime())
            val imeHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom
            callback?.onKeyboardChanged(imeVisible, imeHeight)
            WindowInsetsCompat.CONSUMED
        }
    }

但是这种不适合navigation的多页面路由中使用判断,会导致状态栏显示异常。
方法二:

fun Activity.listenForKeyboardVisibilityChange(callback: (Boolean) -> Unit) {
    val rootView = window.decorView.findViewById<View>(android.R.id.content)
    rootView.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
        private val rect = Rect()
        private var isKeyboardVisible = false

        override fun onGlobalLayout() {
            rootView.getWindowVisibleDisplayFrame(rect)
            val screenHeight = rootView.rootView.height
            val keyboardHeight = screenHeight - rect.bottom

            val isVisible = keyboardHeight > screenHeight * 0.15 // 判断键盘高度是否超过屏幕高度的 15%

            if (isVisible != isKeyboardVisible) {
                isKeyboardVisible = isVisible
                callback(isVisible)
            }
        }
    })
}

在compose中监听软键盘收起状态

    val imeVisible = WindowInsets.Companion.isImeVisible
    LaunchedEffect(WindowInsets.isImeVisible) {
        if (!imeVisible) {
            //软键盘收起
            onSubmit.invoke()
        }
    }

只需要如上的判断既可以监听软键盘状态,而且不会对页面造成影响,可以说是非常简单了,(效果图就不搞了)觉得对你有帮助的也请点个收藏谢谢!