如何强制使 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.LightTheme.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" 来选择强制关闭个别视图。