目标SDK为Android 33时WebSettingsCompat.setAlgorithmicDarkeningAllowed失效求助
解决Android 13(API33)中WebView Algorithmic Darkening不生效的问题
问题根源分析
- 配置变化未监听:代码仅在WebView初始化时执行一次深色模式设置,系统深色模式切换时WebView不会自动更新配置;Android 13中
Algorithmic Darkening的生效依赖实时配置状态。 - 主题上下文问题:若应用主题未正确配置深色模式支持,WebView无法识别系统深色状态,导致开关不生效。
- 版本特性差异:
WebViewFeature.ALGORITHMIC_DARKENING仅在Android 13及以上WebView版本中支持,Android 32返回false是预期行为,会自动 fallback到setForceDark,这部分原有逻辑正确。
修复后的代码实现
class SimpleComposeWebView : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { WebViewComposeTheme { val webView = remember { mutableStateOf<WebView?>(null) } AndroidView( modifier = Modifier.fillMaxSize(), factory = { context -> WebView(context).apply { layoutParams = ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) webViewClient = WebViewClientCompat() setupContentTheming() loadUrl("https://google.com") webView.value = this } }, update = { view -> view.setupContentTheming() } ) } } } override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) recreate() } } fun WebView.setupContentTheming() { val isNightMode = (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES if (isFeatureSupported(WebViewFeature.ALGORITHMIC_DARKENING)) { WebSettingsCompat.setAlgorithmicDarkeningAllowed(settings, isNightMode) if (isFeatureSupported(WebViewFeature.FORCE_DARK)) { WebSettingsCompat.setForceDark(settings, WebSettingsCompat.FORCE_DARK_OFF) } } else if (isFeatureSupported(WebViewFeature.FORCE_DARK)) { @Suppress("DEPRECATION") WebSettingsCompat.setForceDark(settings, if (isNightMode) WebSettingsCompat.FORCE_DARK_ON else WebSettingsCompat.FORCE_DARK_OFF) } }
额外注意事项
- 应用主题配置:确保
WebViewComposeTheme继承自支持深色模式的主题,比如Theme.Material3.DayNight.NoActionBar,在themes.xml中配置:<style name="WebViewComposeTheme" parent="Theme.Material3.DayNight.NoActionBar"> <!-- 其他主题配置 --> </style> - WebView版本验证:确保设备上WebView组件为最新版本,模拟器可通过Google Play更新。
- 加载时机:
setupContentTheming需在loadUrl之前调用,或配置变化时重新调用,确保设置生效后再加载网页。
内容的提问来源于stack exchange,提问作者axstel
相关产品推荐
相关产品推荐

