You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

目标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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 11:22:32