android webview 黑屏问题 , 页面加载时间有点长的情况下

android webview 黑屏问题


What(做了什么)

在 Flayp Signage 内嵌的 WebView(MainActivity.kt → PlayerWebView)上增加了三类行为:

  1. layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)

    明确与全屏容器一致的测量意图(贴近系统 WebView Browser Tester 在 Activity + FrameLayout 中的写法)。

  2. onPageFinished → post { evaluateJavascript(...) }

    在页面加载完成后,向页面注入一次 window.dispatchEvent(new Event('resize')) ,促使页面内联的 setRem() (随 resize 重新计算根字号)再执行。

  3. attachRemReflowOnceWhenSized()

    通过 View.OnLayoutChangeListener ,在 第一次 出现 width > 0 && height > 0 时再触发一次上述 resize,然后移除监听(只执行一次)。

此外,与 H5 自带 <meta name="viewport" ...> 配合时,已保持:

  • settings.useWideViewPort = true
  • settings.loadWithOverviewMode = false
    避免「整页缩成概览」导致主体区域像被挤出可视区(与 Tester 的默认缩放策略更一致)。

Why(为什么 / 解决什么问题)

现象

  • 同一 URL(如 game-place-view/admin.html)在 WebView Browser Tester 或系统浏览器中 列表、比分正常;
  • 在 Flayp 里 often 仅蓝条标题可见,下方大面积黑色 ,而 logcat 里 XMDS / WebSocket / STOMP MESSAGE 仍正常。

根因归纳

对比项 WebView Browser Tester Flayp(Compose)
容器 传统 Activity,WebView 多为 MATCH_PARENT 一次量准 AndroidView 嵌入 Box,首帧常出现宽/高为 0 再变为全屏
页面逻辑 内联 setRem() 依赖 document.documentElement.clientWidth / window.innerWidth 若在 视口仍为 0×0 或未稳定 时跑过 setRem() ,rem 基准会错 ,导致 #app 下列表区域高度/缩放异常,视觉上像「只有头、下面全黑」

因此问题不首先是「没数据」 ,而是 Compose 测量时序 + 页面 rem 适配 叠加后的 渲染布局问题。


Where(改在哪里)

  • 文件 :app/src/main/java/com/flayp/signage/MainActivity.kt
  • 位置 :PlayerWebView 中 iframe 分支 (loadUrl)与 loadDataWithBaseURL 分支 的 WebView 初始化处;以及文件内私有扩展/方法:
    • WebView.requestRemReflowAfterLayout()
    • WebView.attachRemReflowOnceWhenSized()

When(何时会触发 reflow)

时机 作用
onPageFinished 文档声明加载完成后再 post 触发 resize,给 setRem 一次机会。
首次 layout 宽高为正 覆盖 先 onPageFinished、后 Compose 才把 WebView 拉大 的顺序,避免永远停留在错误 rem。

How(如何实现)

  1. evaluateJavascript 执行最小脚本:
    (function(){ try { window.dispatchEvent(new Event('resize')); } catch(e) {} })();

    复用页面已有的 window.addEventListener('resize', setRem),不依赖页面导出全局函数名。

  2. post { ... } 保证在 UI 线程下一帧 执行,避免与 WebView 内部布局竞争。

  3. OnLayoutChangeListener 在宽高有效后触发一次再 remove,避免重复抖动与多余 JS 调用。


验证建议

  • assembleDebug 安装到 API 31+ 模拟器或真机 ,横屏对比 Flayp 与 WebView Browser Tester 同一 URL。
  • chrome://inspect :必要时对比 Console / Elements 中 #app 高度与根字号。
  • 若仅老系统 WebView(如 Chrome 51 级别)仍白屏,需另论 ES 语法兼容性 (与 minSdk / 系统 WebView 升级相关),不在本文 reflow 改动范围内。

相关历史改动(简述)

  • loadWithOverviewMode = false :与带 viewport 的 H5 配合,避免整页被缩成「概览」后主体不可见。
  • 国内 Gradle/Maven 镜像、buildToolsVersion 等:属构建环境,与页面 reflow 无关,不展开。
相关推荐
aqi007 小时前
鸿蒙版本的电子书阅读APP开放源码啦
android·华为·ai编程·harmonyos·鸿蒙
墨天梦7 小时前
B19_SunnyWeather到阅读客户端
android·kotlin
美狐美颜sdk8 小时前
直播APP源码可以直接接入视频美颜sdk吗?技术方案详解
android·人工智能·音视频·美颜sdk·直播美颜sdk
用户693717500138411 小时前
2026,程序员的时代拐点到了
android·前端·后端
浪潮IT馆13 小时前
Android Studio 非最新版本下载安装教程
android·ide·android studio
xiaozongt198914 小时前
MasterGo + Claude Code 生成 Android 布局:完整实践指南
android
Anhty15 小时前
2026最新免费手机音频处理工具 !!
android·功能测试·ios·智能手机·音视频
2501_9159090617 小时前
iOS应用从开发到上架App Store的完整发布流程与步骤指南
android·ios·小程序·https·uni-app·webview
狗凯之家源码网18 小时前
AI 步数修改提交系统源码应用场景与落地指南
android·数据库·人工智能·运动步数
ZHOUPUYU18 小时前
PHP 9.0 前瞻:下一代 PHP 会带来哪些新功能?
android·开发语言·php