如何强制使 WebView 父级变暗以便我可以使用 WebSettingsCompat.FORCE_DARK_AUTO?
How do I force darken the WebView parent so that I can use WebSettingsCompat.FORCE_DARK_AUTO?
我已经按照这个超级有用的答案 的说明进行操作,并且我在 WebView
中实现了黑暗模式,但是 WebSettingsCompat.FORCE_DARK_AUTO
在我使用 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
这让我相信文档正在谈论设置暗模式的不同方式?
这里的文档 https://developer.android.com/reference/androidx/webkit/WebSettingsCompat#FORCE_DARK_AUTO 说:
Enable force dark dependent on the state of the WebView parent view.
If the WebView parent view is being automatically force darkened (@see
android.view.View#setForceDarkAllowed), then WebView content will be
rendered so as to emulate a dark theme. WebViews that are not attached
to the view hierarchy will not be inverted.
我已经在父布局和 WebView
上尝试了 webView.setForceDarkAllowed(true)
和 android:forceDarkAllowed="true"
,但没有帮助。但是,一旦我更改为 WebSettingsCompat.FORCE_DARK_ON
,它就会起作用。
那么我该如何使用FORCE_DARK_AUTO
?
谢谢。
Android Force Dark 和 Android DayNight 主题是两个不同的功能。
Force Dark 旨在让系统自动将“纯光”应用程序转换为暗模式应用程序。这意味着可以快速修复纯光应用程序以“支持”暗模式。如果您的应用不是纯光应用并且已经支持 DayNight/Dark 模式,您不应该(并且基本上不能)使用此功能。
Android DayNight 主题是混合主题,可根据系统主题或 day/night 模式设置在浅色和深色版本之间自动切换。这是实现深色模式的推荐方式。
由于某些无法解释的原因,WebKit/WebView 开发人员决定 link 网络视图的 FORCE_DARK_AUTO
设置为 Android Force Dark 功能,而不是推荐的 DayNight 功能
正如您所说,您的应用使用的是 DayNight 主题。因此,Android 10 Force Dark 功能在您的应用中被禁用,并且您的 webview 上的 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 Force Dark 功能
Force Dark for Android 是 Android 10 (API 29) 中引入的一项功能。它允许任何应用程序或 activity 使用纯色主题因此本身不支持深色模式 在设备 [=92] 时由系统自动变暗=] 在深色模式下。
由于您无法控制此功能如何将暗模式应用到您的活动和组件,仅当您需要“快速修复”以实现暗模式时才建议使用此功能 .如果您想在您的应用程序中正确实现深色模式,您需要使用深色主题或自动切换 DayNight 主题。
要为您的应用程序启用 force dark,它需要:
- 使用或继承自纯光主题(
<item name="isLightTheme">true</item>
需要为主题或其祖先设置)
<item name="android:forceDarkAllowed">true</item>
需要为您的主题或其祖先设置。
- 您需要将 build.gradle 中的
compileSdkVersion
(可能还有 targetSdkVersion
)设置为至少 29
大多数系统和 AndroidX 纯光主题(如 android:Theme.Material.Light
或 Theme.MaterialComponents.Light
)应该默认设置浅色主题 属性,因此创建一个主题像这样从他们那里继承应该启用 force dark:
<style name="AppTheme" parent="Theme.MaterialComponents.Light">
<!-- Other properties here-->
<item name="android:forceDarkAllowed">true</item>
</style>
然后将该主题应用于 Android 清单中的应用程序(或单个 activity)
<application
...
android:theme="@style/AppTheme">
</application>
这将为整个应用程序或您已设置主题的 activity 启用 force dark。现在默认情况下,其中的所有视图都启用了 force dark。您可以通过对它们设置 android:forceDarkAllowed="false"
来选择强制关闭个别视图。
我已经按照这个超级有用的答案 WebView
中实现了黑暗模式,但是 WebSettingsCompat.FORCE_DARK_AUTO
在我使用 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
这让我相信文档正在谈论设置暗模式的不同方式?
这里的文档 https://developer.android.com/reference/androidx/webkit/WebSettingsCompat#FORCE_DARK_AUTO 说:
Enable force dark dependent on the state of the WebView parent view. If the WebView parent view is being automatically force darkened (@see android.view.View#setForceDarkAllowed), then WebView content will be rendered so as to emulate a dark theme. WebViews that are not attached to the view hierarchy will not be inverted.
我已经在父布局和 WebView
上尝试了 webView.setForceDarkAllowed(true)
和 android:forceDarkAllowed="true"
,但没有帮助。但是,一旦我更改为 WebSettingsCompat.FORCE_DARK_ON
,它就会起作用。
那么我该如何使用FORCE_DARK_AUTO
?
谢谢。
Android Force Dark 和 Android DayNight 主题是两个不同的功能。
Force Dark 旨在让系统自动将“纯光”应用程序转换为暗模式应用程序。这意味着可以快速修复纯光应用程序以“支持”暗模式。如果您的应用不是纯光应用并且已经支持 DayNight/Dark 模式,您不应该(并且基本上不能)使用此功能。
Android DayNight 主题是混合主题,可根据系统主题或 day/night 模式设置在浅色和深色版本之间自动切换。这是实现深色模式的推荐方式。
由于某些无法解释的原因,WebKit/WebView 开发人员决定 link 网络视图的 FORCE_DARK_AUTO
设置为 Android Force Dark 功能,而不是推荐的 DayNight 功能
正如您所说,您的应用使用的是 DayNight 主题。因此,Android 10 Force Dark 功能在您的应用中被禁用,并且您的 webview 上的 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 Force Dark 功能
Force Dark for Android 是 Android 10 (API 29) 中引入的一项功能。它允许任何应用程序或 activity 使用纯色主题因此本身不支持深色模式 在设备 [=92] 时由系统自动变暗=] 在深色模式下。
由于您无法控制此功能如何将暗模式应用到您的活动和组件,仅当您需要“快速修复”以实现暗模式时才建议使用此功能 .如果您想在您的应用程序中正确实现深色模式,您需要使用深色主题或自动切换 DayNight 主题。
要为您的应用程序启用 force dark,它需要:
- 使用或继承自纯光主题(
<item name="isLightTheme">true</item>
需要为主题或其祖先设置) <item name="android:forceDarkAllowed">true</item>
需要为您的主题或其祖先设置。- 您需要将 build.gradle 中的
compileSdkVersion
(可能还有targetSdkVersion
)设置为至少 29
大多数系统和 AndroidX 纯光主题(如 android:Theme.Material.Light
或 Theme.MaterialComponents.Light
)应该默认设置浅色主题 属性,因此创建一个主题像这样从他们那里继承应该启用 force dark:
<style name="AppTheme" parent="Theme.MaterialComponents.Light">
<!-- Other properties here-->
<item name="android:forceDarkAllowed">true</item>
</style>
然后将该主题应用于 Android 清单中的应用程序(或单个 activity)
<application
...
android:theme="@style/AppTheme">
</application>
这将为整个应用程序或您已设置主题的 activity 启用 force dark。现在默认情况下,其中的所有视图都启用了 force dark。您可以通过对它们设置 android:forceDarkAllowed="false"
来选择强制关闭个别视图。