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

Accompanist WebView在Jetpack Compose中软键盘遮挡输入框求助

Jetpack Compose中Accompanist WebView输入框被软键盘遮挡的解决方案
  • 确认基础配置并调整系统窗口适配
    虽然你已经在AndroidManifest.xml设置了android:windowSoftInputMode="adjustResize",但需要在Activity的onCreate中添加代码关闭Compose默认的Decor适配,否则系统的软键盘调整规则可能失效:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 关键:关闭默认Decor适配,让adjustResize生效
        WindowCompat.setDecorFitsSystemWindows(window, false)
        setContent {
            // 你的Compose页面内容
        }
    }
    
  • 处理Compose WindowInsets,让WebView响应软键盘变化
    在WebView的父布局中,通过WindowInsets.ime自动适配软键盘高度,确保输入框不被遮挡:

    Box(
        modifier = Modifier
            .fillMaxSize()
            .windowInsetsPadding(WindowInsets.navigationBars)
            .windowInsetsPadding(WindowInsets.ime) // 自动添加软键盘高度的内边距
    ) {
        WebView(
            state = rememberWebViewState(url = "你的网页地址"),
            modifier = Modifier.fillMaxSize()
        )
    }
    

    要是想要更平滑的动画效果,也可以用WindowInsetsAnimationCallback监听软键盘弹出/收起的动画过程:

    val imeInsets = rememberWindowInsetsAnimationState(WindowInsets.ime)
    Box(
        modifier = Modifier
            .fillMaxSize()
            .windowInsetsPadding(WindowInsets.navigationBars)
            .padding(bottom = imeInsets.insets.bottom.toDp())
            .windowInsetsAnimationCallback(imeInsets.callback)
    ) {
        WebView(/* 你的WebView配置 */)
    }
    
  • 升级Accompanist WebView到最新稳定版
    部分旧版本的Accompanist WebView存在软键盘适配的bug,检查你的依赖版本,替换为当前最新的稳定版(比如0.32.0,可根据官方更新调整):

    implementation "com.google.accompanist:accompanist-webview:0.32.0"
    
  • 手动监听软键盘高度(兜底方案)
    如果以上方法都无效,可以通过原生监听获取软键盘高度,动态调整WebView的底部内边距:

    val context = LocalContext.current
    val keyboardHeight = remember { mutableStateOf(0) }
    
    DisposableEffect(Unit) {
        val view = (context as Activity).window.decorView
        val listener = ViewTreeObserver.OnGlobalLayoutListener {
            val rect = Rect()
            view.getWindowVisibleDisplayFrame(rect)
            val screenHeight = view.rootView.height
            // 过滤掉屏幕底部的导航栏高度(用0.15比例判断是否是软键盘)
            val keyboardHeightValue = screenHeight - rect.bottom
            keyboardHeight.value = if (keyboardHeightValue > screenHeight * 0.15) keyboardHeightValue else 0
        }
        view.viewTreeObserver.addOnGlobalLayoutListener(listener)
        onDispose {
            view.viewTreeObserver.removeOnGlobalLayoutListener(listener)
        }
    }
    
    Box(
        modifier = Modifier
            .fillMaxSize()
            .padding(bottom = keyboardHeight.value.toDp())
    ) {
        WebView(/* 你的WebView配置 */)
    }
    

内容的提问来源于stack exchange,提问作者c-an

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:42:41