我们的应用程序依赖于AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
让我们从values/colors
和values-night/colors
但是每次我们尝试使用 时WebView
,它都会从重置 UiMode 开始,我们的应用会混淆为我们的主题选择哪些颜色值
有没有人遇到过类似的问题?
我们的应用程序依赖于AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
让我们从values/colors
和values-night/colors
但是每次我们尝试使用 时WebView
,它都会从重置 UiMode 开始,我们的应用会混淆为我们的主题选择哪些颜色值
有没有人遇到过类似的问题?
回答我自己的问题,看起来谷歌解决了这个问题https://issuetracker.google.com/issues/37124582
与https://developer.android.com/jetpack/androidx/releases/appcompat#1.1.0-alpha03 Fixed WebView resets DayNight Resources
由于上一期已关闭,我打开了新一期:https ://issuetracker.google.com/issues/170328697
我试图以这种方式修复它:
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
支持,我们可以从三个可用选项中进行选择:
FORCE_DARK_OFF - 禁用深色主题,内容将以默认浅色主题呈现 FORCE_DARK_ON - 启用深色主题,内容将以深色主题呈现 FORCE_DARK_AUTO - 根据父视图的状态启用深色主题 然后我们需要使用 WebSettingsCompat 应用设置
WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON)
您可以在下面的博文中更详细地阅读
https://androidexplained.github.io/ui/android/material-design/2020/09/24/dark-mode-webview.html