我正在使用 Cordova for Android 应用程序。我在 CordovaWebView 上加载一个网页,其中暗模式 css 定义为 @media(prefers-color-scheme)。 Android 不尊重网页深色方案。 (
<head> has <meta name="color-scheme" content="dark light">
)
Android 支持两种 DarkMode 策略。
Android 可以让您使用此代码决定暗模式策略
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK_STRATEGY)) {
WebSettingsCompat.setForceDarkStrategy(webView.getSettings(), WebSettingsCompat.DARK_STRATEGY_WEB_THEME_DARKENING_ONLY);
}
但是它似乎不适用于 Cordova WebView。 (我用 WebView 测试了这段代码。它工作正常)。我在这里缺少什么?这是 Cordova Bug 吗?我在
Cordova Github Bug Report 上找到了一些东西。但我没有找到任何解决方案。
https://github.com/hanscappelle/android-darkmode-example 制作了一个示例项目。这就是我为了支持黑暗模式+让用户在应用程序中更改模式所做的。
使用支持深色模式的主题Light
的主题是特定的浅色主题,需要更多步骤才能使其正常工作(请参阅下文)。现在,选择一个名称中带有
DayNight
的主题作为您的应用主题的父主题。
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
有关暗模式支持的主题的更多信息https://m2.material.io/develop/android/theming/dark
如果您正在寻找上述主题所需的依赖项:
implementation("com.google.android.material:material:1.10.0")
检查您的网页内容是否支持深色模式
@media (prefers-color-scheme: dark)
项目中的 webapp
文件夹中提供了完整的 html 示例。您还可以使用 firebase 托管的示例应用程序进行快速测试https://darkmode-example.web.app/ 可选择允许用户选择模式
为了允许用户否决您应用程序的此设置,您需要提供一些触发此设置的设置(对于 API 级别 31 及以上):
@RequiresApi(Build.VERSION_CODES.S)
private fun forceMode(mode: int) {
val uiManager = getSystemService(UI_MODE_SERVICE) as UiModeManager
uiManager.setApplicationNightMode(mode)
}
请注意,UiModeManager.MODE_NIGHT_NO
模式将强制使用灯光模式。使用
UiModeManager.MODE_NIGHT_YES
强制使用深色模式,并且
UiModeManager.MODE_NIGHT_AUTO
再次使用系统范围主题。示例项目包含较低 API 级别的代码(使用
AppCompatDelegate.setDefaultNightMode
<=30) also where the
方法代替。加上不同的模式!所以请仔细检查导入。可选择坚持
Light
基本主题
有关如何解决此问题的更多信息
https://developer.android.com/develop/ui/views/theming/darktheme#force-dark