Android Webview 处理日/夜模式与其他视图略有不同。将您的主题设置为深色会将 WebView 组件(滚动条、缩放按钮等)更改为深色模式版本,但不会更改它加载的内容。
要更改内容,您需要使用 webview 设置的 setForceDark 方法使其也更改其内容。此方法的兼容版本可以在 AndroidX webkit 包中找到。
将以下依赖项添加到您的 gradle 构建中:
implementation 'androidx.webkit:webkit:1.3.0'
(1.3.0 是此软件包的最低要求版本。但更高版本也应该可以工作。)
并将以下代码行添加到您的 webview 初始化中:
if(WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
WebSettingsCompat.setForceDark(myWebView.getSettings(), WebSettingsCompat.FORCE_DARK_ON);
}
检查是为了isFeatureSupported
确保用户在其设备上安装的Android System WebView版本支持暗模式(因为这可以通过 Google Play 独立于 Android 版本进行更新或降级)。
注意:该功能需要在运行的设备上安装setForceDark
Android System WebView v76或更高版本。
webview 内容的 force dark 功能有两个所谓的策略:
要设置 webview 应该使用哪种策略来应用强制黑暗,您可以使用以下代码:
if(WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK_STRATEGY)) {
WebSettingsCompat.setForceDarkStrategy(myWebView.getSettings(), WebSettingsCompat.DARK_STRATEGY_WEB_THEME_DARKENING_ONLY);
}
注意:策略选择需要在运行设备上安装Android System WebView v83或更高版本。setForceDark
支持但不支持策略选择的WebView 版本(v76 到 v81)将使用用户代理变暗
支持的策略选项有:
- DARK_STRATEGY_USER_AGENT_DARKENING_ONLY:仅使用用户代理变暗并忽略内容中的任何主题(默认)
- DARK_STRATEGY_WEB_THEME_DARKENING_ONLY:仅使用内容本身的深色主题将页面设置为深色模式。如果内容没有深色主题,则 webview 不会应用任何变暗并“按原样”显示。
- DARK_STRATEGY_PREFER_WEB_THEME_OVER_USER_AGENT_DARKENING:使用内容本身的深色主题将页面设置为深色模式。如果内容没有深色主题,请使用用户代理变暗。
Javascript 检查如何对变暗的 webviews 起作用?
JavaScript 调用window.matchMedia('(prefers-color-scheme: dark)')
将在用户代理变暗和 Web 主题变暗策略中匹配。
我的 webview 设置为 FORCE_DARK_AUTO 并且我的应用程序在昼夜主题中运行,但不知何故,我的 webview 不会根据我的应用程序主题自动应用暗模式。为什么会这样?
这是因为FORCE_DARK_AUTO
webview 的设置值不适用于主题(如文档中所述)。它检查Android 10 强制黑暗功能(应用程序的“快速修复”黑暗模式功能。它的名称类似,但与 WebView 强制黑暗没有直接关系)。
如果您没有使用强制黑暗,而是使用应用程序主题来处理黑暗模式(如推荐的那样),您必须自己检查何时应用 webview 的强制黑暗功能。使用 DayNight 主题的示例:
int nightModeFlags = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
if (nightModeFlags == Configuration.UI_MODE_NIGHT_YES) {
//Code to enable force dark using FORCE_DARK_ON and select force dark strategy
}