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)
但是,它仅适用于我导航到该页面并且键盘自动打开时。
摘自这篇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)
| 归档时间: |
|
| 查看次数: |
1350 次 |
| 最近记录: |