Android API33下WebView应用禁用暗色模式失效(MIUI设备)求助
WebView适配Android 13(targetSdk33)后MIUI设备暗色模式失效问题
问题描述
开发WebView应用时,原本通过以下代码禁用暗色模式:
WebSettingsCompat.setForceDark(settings, WebSettingsCompat.FORCE_DARK_OFF);
将targetSdk升级至33后该方法废弃,改用适配代码:
if (SDK_INT >= 33) { if (WebViewFeature.isFeatureSupported(WebViewFeature.ALGORITHMIC_DARKENING)) { WebSettingsCompat.setAlgorithmicDarkeningAllowed(settings, false); } }else{ if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { WebSettingsCompat.setForceDark(settings, WebSettingsCompat.FORCE_DARK_OFF); } }
但安装到小米Redmi 8T(MIUI系统)后,暗色模式仍严重影响应用显示,该应用在Android Studio模拟器中运行正常,仅MIUI设备存在此问题。
已尝试的无效方案
- 将themes.xml复制到dark/themes.xml目录
- 在
onCreate中添加代码:AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); - 在themes.xml中添加配置:
<item name="android:forceDarkAllowed" tools:targetApi="q">false</item> - 将主题从
Theme.MaterialComponents.DayNight.DarkActionBar改为Theme.MaterialComponents.Light.DarkActionBar - 组合使用上述所有方案
解决方案确认与补充思路
你找到的针对MIUI的解决方案是有效的,核心是通过反射绕过MIUI定制WebView的强制暗色逻辑——MIUI会自行添加一套WebView暗色适配规则,不受系统WebView设置的控制。具体实现代码如下:
try { Class<?> webViewFactoryClass = Class.forName("android.webkit.WebViewFactory"); Method getProviderMethod = webViewFactoryClass.getMethod("getProvider"); Object webViewProvider = getProviderMethod.invoke(null); Class<?> webViewProviderClass = Class.forName("android.webkit.WebViewProvider"); Method getWebViewMethod = webViewProviderClass.getMethod("getWebView"); Object webView = getWebViewMethod.invoke(webViewProvider); Class<?> webViewClass = Class.forName("android.webkit.WebView"); Field settingsField = webViewClass.getDeclaredField("mSettings"); settingsField.setAccessible(true); Object settings = settingsField.get(webView); Class<?> webSettingsClass = Class.forName("android.webkit.WebSettings"); Field algorithmicDarkeningField = webSettingsClass.getDeclaredField("mAlgorithmicDarkeningAllowed"); algorithmicDarkeningField.setAccessible(true); algorithmicDarkeningField.setBoolean(settings, false); } catch (Exception e) { e.printStackTrace(); }
此外可尝试以下补充思路:
- 更新WebView版本:MIUI搭载定制版WebView,将设备上的WebView更新至官方最新版本后重新测试,部分旧版定制WebView的适配bug可能已被修复
- 页面层面强制浅色:如果WebView加载的H5页面支持暗色模式,可在页面头部添加
<meta name="color-scheme" content="only light">,从页面本身强制锁定浅色模式,规避系统适配逻辑 - 验证WebView初始化顺序:确保所有WebView设置(包括暗色模式禁用代码)在调用
loadUrl或loadData之前执行,避免加载后设置不生效
内容的提问来源于stack exchange,提问作者Rafail Antoniadis
相关产品推荐
相关产品推荐

