如何在Jetpack Compose的Composable中判断软键盘是否处于显示状态
Jetpack Compose 软键盘显示状态检测方案
方案1:使用原生WindowInsets API(Compose 1.2.0及以上版本推荐)
这是官方提供的标准实现,无需引入额外依赖,使用简单:
- 基础示例代码
@Composable fun ScreenContent() { // 方式1:兼容1.2.x版本 val density = LocalDensity.current val isKeyboardShow = WindowInsets.ime.getBottom(density) > 0 // 方式2:Compose 1.3.0及以上可以直接用这个属性 // val isKeyboardShow = LocalWindowInsets.current.ime.isVisible // 监听状态变化执行对应操作 LaunchedEffect(isKeyboardShow) { if (isKeyboardShow) { // 软键盘显示时执行的逻辑 } else { // 软键盘隐藏时执行的逻辑 } } // 你的其余UI代码 }
- 前置要求:需要在AndroidManifest对应Activity的配置中添加
android:windowSoftInputMode="adjustResize",否则IME insets不会正常更新,检测结果会失效。
方案2:低版本兼容实现
如果你的项目Compose版本低于1.2.0,可以通过监听视图布局变化实现检测:
- 先封装可复用的状态监听函数
@Composable fun rememberKeyboardState(): State<Boolean> { val activity = LocalContext.current as Activity val isShow = remember { mutableStateOf(false) } DisposableEffect(Unit) { val rootView = activity.window.decorView val layoutListener = ViewTreeObserver.OnGlobalLayoutListener { val visibleRect = Rect() rootView.getWindowVisibleDisplayFrame(visibleRect) val screenHeight = rootView.height val keyboardHeight = screenHeight - visibleRect.bottom // 高度差超过屏幕的15%则判断为软键盘显示 isShow.value = keyboardHeight > screenHeight * 0.15 } rootView.viewTreeObserver.addOnGlobalLayoutListener(layoutListener) onDispose { rootView.viewTreeObserver.removeOnGlobalLayoutListener(layoutListener) } } return isShow }
- 使用示例
@Composable fun DemoPage() { val isKeyboardShow by rememberKeyboardState() // 直接使用isKeyboardShow变量做逻辑判断或者UI渲染即可 }
额外说明
如果需要手动控制软键盘的弹出和收起,可以直接调用LocalSoftwareKeyboardController.current提供的show()和hide()方法。
内容的提问来源于stack exchange,提问作者DanielDiSu
相关产品推荐
相关产品推荐

