Android Force Dark 和 Android DayNight 主题是两个不同的功能。
由于某些无法解释的原因,WebKit/WebView 开发人员决定将 webview 的FORCE_DARK_AUTO
设置链接到 Android Force Dark 功能,而不是推荐的 DayNight 功能
正如您所说,您的应用正在使用 DayNight 主题。因此,您的应用中禁用了 Android 10 Force Dark 功能,并且您的 web 视图上的FORCE_DARK_AUTO
设置不起作用。
因此,要为您的 webview 启用自动暗模式切换,您需要检查 DayNight 主题正在运行的模式,然后相应地启用或禁用 webview 上的暗模式:
if(WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
int nightModeFlags = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
if (nightModeFlags == Configuration.UI_MODE_NIGHT_YES) {
//Theme is switched to Night/Dark mode, turn on webview darkening
WebSettingsCompat.setForceDark(myWebView.getSettings(), WebSettingsCompat.FORCE_DARK_ON);
}
else{
//Theme is not switched to Night/Dark mode, turn off webview darkening
WebSettingsCompat.setForceDark(myWebView.getSettings(), WebSettingsCompat.FORCE_DARK_OFF);
}
}
尽管不推荐,但如果您仍想放弃对 DayNight 主题的支持并启用 Force Dark 快速修复,您可以阅读下面有关 Android 10 的 Force Dark 功能的一些一般信息。
Android 10 强制黑暗功能
适用于 Android 的 Force Dark 是 Android 10 (API 29) 中引入的一项功能。它允许任何使用纯光主题的应用程序或活动,因此当设备在暗模式下运行时,它本身不支持暗模式,系统会自动将其变暗。
由于您无法控制此功能如何将暗模式应用于您的活动和组件,因此建议仅在您需要“快速修复”来实施暗模式时使用。如果您想在您的应用程序中正确实现暗模式,您需要使用暗主题或自动切换的 DayNight 主题。
要为您的应用程序启用强制黑暗,它需要:
- 使用或继承自光主题(
<item name="isLightTheme">true</item>
需要为主题或其祖先设置)
<item name="android:forceDarkAllowed">true</item>
需要为您的主题或其祖先设置。
- 您需要将 build.gradle 中的
compileSdkVersion
(并且可能targetSdkVersion
)设置为至少 29
大多数系统和 AndroidX 仅浅色主题(如android:Theme.Material.Light
或Theme.MaterialComponents.Light
)应该默认设置浅色主题属性,因此像这样创建从它们继承的主题应该启用强制黑暗:
<style name="AppTheme" parent="Theme.MaterialComponents.Light">
<!-- Other properties here-->
<item name="android:forceDarkAllowed">true</item>
</style>
然后将该主题应用于 Android 清单中的应用程序(或单个活动)
<application
...
android:theme="@style/AppTheme">
</application>
这将为您设置主题的整个应用程序或活动启用强制黑暗。现在默认情况下,其中的所有视图都启用了强制黑暗。您可以通过设置个别视图来选择强制黑暗android:forceDarkAllowed="false"
。