4

我已经按照这个超级有用的答案https://stackoverflow.com/a/61643614/704836的说明进行操作,并且我在WebView实现中使用了暗模式但是WebSettingsCompat.FORCE_DARK_AUTO在我使用时似乎不起作用AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES),这让我相信文档是在谈论设置暗模式的不同方式吗?

这里的文档https://developer.android.com/reference/androidx/webkit/WebSettingsCompat#FORCE_DARK_AUTO说:

根据 WebView 父视图的状态启用强制变暗。 如果 WebView 父视图被自动强制变暗(@see android.view.View#setForceDarkAllowed),则将呈现 WebView 内容以模拟深色主题。未附加到视图层次结构的 WebView 不会被反转。

我已经尝试过父布局webView.setForceDarkAllowed(true)android:forceDarkAllowed="true"theWebView并没有帮助。但是一旦我改变WebSettingsCompat.FORCE_DARK_ON它,它就会起作用。

那么我该如何使用FORCE_DARK_AUTO呢?

谢谢。

4

1 回答 1

8

Android Force Dark 和 Android DayNight 主题是两个不同的功能。

  • Force Dark 旨在通过系统自动将“仅光”应用程序转换为暗模式应用程序。它是一种快速修复纯光应用程序以“支持”暗模式的方法。如果你的应用不是光模式并且已经支持 DayNight/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.LightTheme.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"

于 2020-07-31T12:17:34.120 回答