观察软键盘的可见性,打开/关闭 Jetpack Compose

Jay*_*Dee 5 android android-softkeyboard kotlin android-jetpack-compose compose-recomposition

我正在尝试积极观察软键盘的可见性,目前,我正在尝试使用

WindowInsets.isImeVisible
Run Code Online (Sandbox Code Playgroud)

但我似乎无法观察到它的状态变化。有人提到使用

ViewCompat.setOnApplyWindowInsetsListener()
Run Code Online (Sandbox Code Playgroud)

但我不太明白如何实现这个来观察键盘的可见性。

我已经设法使用

WindowInsets.isImeVisible
Run Code Online (Sandbox Code Playgroud)

但是,它仅适用于我导航到该页面并且键盘自动打开时。

z.g*_*g.y 6

摘自这篇SO帖子,

您可以使用它来检查是否keyboard打开或关闭

internal enum class Keyboard {
    Opened, Closed
}

@Composable
internal 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
}
Run Code Online (Sandbox Code Playgroud)

你可以像这样测试一下

@Composable
fun KeyboardCheck() {

    val keyboard by keyboardAsState()

    Log.e("KeyboardCheck", "$keyboard")

    TextField(value = "", onValueChange = {})
}
Run Code Online (Sandbox Code Playgroud)

每次键盘打开和关闭时都会打印

E/KeyboardCheck: Closed
E/KeyboardCheck: Opened
E/KeyboardCheck: Closed
E/KeyboardCheck: Opened
E/KeyboardCheck: Closed
Run Code Online (Sandbox Code Playgroud)