1. 当AutoSize遇上WebView:适配失效引发的"假白屏"
第一次遇到WebView白屏问题时,我盯着屏幕愣了半天——明明网页内容已经加载完成,控制台也没有报错,为什么显示区域一片空白?后来才发现这根本不是真正的白屏,而是AutoSize适配失效导致的视觉欺骗。当项目中使用副单位(如pt、mm等)时,WebView内部的控件可能因为单位换算异常变得异常巨大,最终超出可视范围形成"假白屏"。
解决这个问题的关键在于重写WebView的滚动模式回调。下面这个Kotlin实现方案我在三个商业项目中验证过有效性:
kotlin复制class SafeAutoSizeWebView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : WebView(context, attrs, defStyleAttr) {
override fun setOverScrollMode(mode: Int) {
super.setOverScrollMode(mode)
(context as? Activity)?.let {
AutoSize.autoConvertDensityOfGlobal(it)
}
}
}
这里有个容易踩的坑:很多开发者会直接继承系统WebView却忘记处理构造器重载。建议使用@JvmOverloads注解避免Java调用时的兼容性问题。实测发现,在华为EMUI系统上,如果不做这个适配,横竖屏切换时有80%概率会出现适配异常。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. DOM Storage未启用:最容易被忽视的配置项
如果你在搜索引擎输入"WebView白屏",第一个跳出来的解决方案肯定是开启DOM Storage。这个HTML5特性允许网页将数据存储在本地,当它被禁用时,依赖localStorage或sessionStorage的页面会直接白屏。但很多人不知道的是,这个配置项在不同Android版本上的默认值居然不同:
- Android 4.4以下:默认关闭
- Android 5.0-9.0:默认开启
- Android 10+:默认关闭但行为有变化
正确的配置方式应该是:
java复制webView.settings.apply {
domStorageEnabled = true
databaseEnabled = true // 这个配套设置经常被遗漏
setDatabasePath(context.cacheDir.path)
}
我曾经接手过一个电商项目,商品详情页在小米手机上正常显示,却在OPPO手机上白屏。最终发现就是因为没有统一设置databasePath,导致不同厂商的默认存储路径权限差异引发问题。建议在Application初始化时就统一配置这些基础参数。
