如何在 jetpack compose 中检测键盘的打开和关闭?

2024-06-13

我在撰写中发现的唯一方法是使用accompanist-insets并删除窗口插入。这会导致我的应用程序布局出现其他问题。

Android的方式似乎是this https://stackoverflow.com/questions/4745988/how-do-i-detect-if-software-keyboard-is-visible-on-android-device-or-not/26964010#26964010我可以将其传递到我的撰写应用程序中并采取相应的行动。

jetpack compose 还有其他方法吗?


Update

随着新WindowInsetsAPI,变得更简单

首先,要返回正确的值,您需要设置:

WindowCompat.setDecorFitsSystemWindows(window, false)

然后使用键盘作为状态:

@Composable
fun keyboardAsState(): State<Boolean> {
    val isImeVisible = WindowInsets.ime.getBottom(LocalDensity.current) > 0
    return rememberUpdatedState(isImeVisible)
}

使用示例:

val isKeyboardOpen by keyboardAsState() // true or false

ps:我尝试使用 WindowInsets.isImeVisible,但它在第一次调用中返回 true。


没有实验性 API

如果你想要声明,我找到了这个解决方案:

enum class Keyboard {
    Opened, Closed
}

@Composable
fun keyboardAsState(): State<Keyboard> {
    val keyboardState = remember { mutableStateOf(Keyboard.Closed) }
    val view = LocalView.current
    DisposableEffect(view) {
        val onGlobalListener = ViewTreeObserver.OnGlobalLayoutListener {
            val rect = Rect()
            view.getWindowVisibleDisplayFrame(rect)
            val screenHeight = view.rootView.height
            val keypadHeight = screenHeight - rect.bottom
            keyboardState.value = if (keypadHeight > screenHeight * 0.15) {
                Keyboard.Opened
            } else {
                Keyboard.Closed
            }
        }
        view.viewTreeObserver.addOnGlobalLayoutListener(onGlobalListener)

        onDispose {
            view.viewTreeObserver.removeOnGlobalLayoutListener(onGlobalListener)
        }
    }

    return keyboardState
}

要检测/检查该值,您只需要这样:

val isKeyboardOpen by keyboardAsState() // Keyboard.Opened or Keyboard.Closed 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 jetpack compose 中检测键盘的打开和关闭? 的相关文章

随机推荐