我在撰写中发现的唯一方法是使用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
随着新WindowInsets
API,变得更简单
首先,要返回正确的值,您需要设置:
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(使用前将#替换为@)