Android WebView重置UiMode和打破黑暗主题

Android WebView重置UiMode和打破黑暗主题,android,android-webview,android-theme,android-dark-theme,Android,Android Webview,Android Theme,Android Dark Theme,我们的应用程序依赖于AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE\u NIGHT\u YES)让我们从值/颜色和值/颜色中选择明暗主题颜色 但每次我们尝试使用网络视图时,它都是从重置UiMode开始的,我们的应用程序会混淆为主题选择哪些颜色值 有些人详细地讨论了这个问题,并且 有人遇到过类似的问题吗 回答我自己的问题,看起来谷歌解决了这个问题 使用修复了WebView重置日间资源的问题由于上一期已关闭,我打开了新的一期:

我们的应用程序依赖于
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE\u NIGHT\u YES)
让我们从
值/颜色和
值/颜色中选择明暗主题颜色

但每次我们尝试使用
网络视图时,它都是从重置UiMode开始的,我们的应用程序会混淆为主题选择哪些颜色值

有些人详细地讨论了这个问题,并且


有人遇到过类似的问题吗

回答我自己的问题,看起来谷歌解决了这个问题


使用
修复了WebView重置日间资源的问题

由于上一期已关闭,我打开了新的一期:

我试着用这种方式来解决它:

class UiModeCareWebView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : WebView(context, attrs, defStyleAttr) {

    init {
        fixUiModeIfNeeded()
    }

    private fun fixUiModeIfNeeded() {
        val configuration = context.resources.configuration
        val configurationNighMode = configuration.uiMode and UI_MODE_NIGHT_MASK
        val appCompatNightMode = getDefaultNightMode()

        val newUiModeConfiguration = when {
            configurationNighMode == UI_MODE_NIGHT_NO && appCompatNightMode == MODE_NIGHT_YES -> {
                UI_MODE_NIGHT_YES or (configuration.uiMode and UI_MODE_NIGHT_MASK.inv())
            }
            configurationNighMode == UI_MODE_NIGHT_YES && appCompatNightMode == MODE_NIGHT_NO -> {
                UI_MODE_NIGHT_NO or (configuration.uiMode and UI_MODE_NIGHT_MASK.inv())
            }
            else -> null
        }

        if (newUiModeConfiguration != null) {
            val fixedConfiguration = Configuration().apply {
                uiMode = newUiModeConfiguration
            }
            @Suppress("DEPRECATION")
            context.resources.updateConfiguration(
                fixedConfiguration,
                context.resources.displayMetrics
            )
        }
    }
}

首先,您需要将android.webkit依赖项添加到您的项目中

dependencies {
   implementation "androidx.webkit:webkit:1.3.0"
}
在撰写本文时,webkit的最新稳定版本是1.3.0。 值得注意的是,在1.2.0版本中添加了暗主题支持,在此版本之前,无法将暗主题支持添加到Webview

下一步是检查用户设备上的Webview和Android框架是否支持主题化:

if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
   ...
}
请注意,
WebViewFeature.FORCE_DARK
仅从Webview版本76开始受支持。不幸的是,在此版本之前,没有直接的方法来支持黑暗主题。 如果您拥有Webview中显示的内容,您可能希望实现自定义CSS主题,并使用应用程序中的@JavascriptInterface切换它们

如果支持
WebViewFeature.FORCE_DARK
,我们可以从三个可用选项中进行选择:

强制关闭暗主题-禁用暗主题,内容将以默认的亮主题呈现 强制打开暗主题-启用暗主题,内容将以暗主题呈现 强制“暗”自动-根据父视图的状态启用暗主题 然后我们需要使用WebSettingsCompat应用该设置

WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON)
你可以在下面的博客文章中阅读更多细节


1.1.0-alpha在使用旧版本Android系统WebView的设备上也对我造成了冲击——在设备/模拟器上,如API 21到23(OS5,6)。下面是我如何绕过这个问题的是的,我看到了,并且以这种方式实现了它。不幸的是,我使用的是一个外部sdk,它也崩溃了,我无法修复它:/必须等待他们发布修复版本