我正在积极地观察软键盘的可见性,目前,我正在try 用
WindowInsets.isImeVisible
但我似乎观察不到它的状态变化.有人提到使用
ViewCompat.setOnApplyWindowInsetsListener()
但我不太明白如何实现此功能来观察键盘可见性.
我已经设法使用了
WindowInsets.isImeVisible
然而,它只在我导航到页面并且键盘自动打开时才适用.
我正在积极地观察软键盘的可见性,目前,我正在try 用
WindowInsets.isImeVisible
但我似乎观察不到它的状态变化.有人提到使用
ViewCompat.setOnApplyWindowInsetsListener()
但我不太明白如何实现此功能来观察键盘可见性.
我已经设法使用了
WindowInsets.isImeVisible
然而,它只在我导航到页面并且键盘自动打开时才适用.
摘自这S.O条帖子,
您可以使用它来判断keyboard
是opened还是closed
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