You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:42:00