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

5

我正在尝试主动观察软键盘的可见性,目前,我正在使用以下方式观察:

WindowInsets.isImeVisible

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

ViewCompat.setOnApplyWindowInsetsListener()

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

我已经成功使用了

WindowInsets.isImeVisible

然而,它只适用于我导航到页面和键盘自动打开的时候。
1个回答

5

以下内容翻译自 S.O 帖子:

您可以使用以下代码来检测键盘是否已经打开关闭

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
}

你可以这样测试它:
@Composable
fun KeyboardCheck() {

    val keyboard by keyboardAsState()

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

    TextField(value = "", onValueChange = {})
}

每次键盘打开和关闭时,它都会打印出来。
E/KeyboardCheck: Closed
E/KeyboardCheck: Opened
E/KeyboardCheck: Closed
E/KeyboardCheck: Opened
E/KeyboardCheck: Closed

1
非常感谢,非常准确,现在我只需要弄清楚如何调整焦点,使屏幕上的指针成为兴趣点。 - JayDee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接