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
相关产品推荐
相关产品推荐

