Как заставить затемнить родительский элемент WebView, чтобы я мог использовать WebSettingsCompat.FORCE_DARK_AUTO?

Я выполнил инструкции по этому очень полезному ответу 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" на родительском макете и на WebView, и это не помогло. Но как только я перехожу на WebSettingsCompat.FORCE_DARK_ON, все работает.

Итак, как я могу использовать FORCE_DARK_AUTO?

Спасибо.


person casolorz    schedule 16.07.2020    source источник
comment
from google serach - ›FORCE_DARK_AUTO - включить принудительный темный режим для веб-просмотра в зависимости от состояния родительского представления, что означает, что при рендеринге содержимого веб-просмотра будет соблюдаться системная настройка темного режима.   -  person Wini    schedule 21.07.2020
comment
Да, это моя проблема, я так читал, но если я использую AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES), это не работает, если я использую AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) и устанавливаю систему на темный цвет, то это тоже не работает. Должен быть какой-то другой способ сказать ему, что система находится в темном режиме. Я пробую это на Android 10, не уверен, что это имеет значение.   -  person casolorz    schedule 21.07.2020


Ответы (1)


Темы Android Force Dark и Android DayNight - это две разные функции.

  • Force Dark предназначен для автоматического превращения световых приложений в приложения темного режима системой. Это предназначено как быстрое решение для световых приложений для поддержки темного режима. Если ваше приложение не предназначено только для освещения и уже поддерживает режим DayNight / Dark, вы не должны (и в принципе не можете) использовать эту функцию.

  • Темы Android DayNight - это гибридные темы, которые автоматически переключаются между светлой и темной версиями в зависимости от системной темы или настроек дневного / ночного режима. Это рекомендуемый способ реализовать темный режим.

По какой-то необъяснимой причине разработчики WebKit / WebView решили связать настройку FORCE_DARK_AUTO веб-просмотра с функцией Android Force Dark, но не с рекомендуемой функцией DayNight.

Как вы заявили, ваше приложение использует тему DayNight. Поэтому в вашем приложении отключена функция Android 10 Force Dark, а параметр FORCE_DARK_AUTO в вашем веб-просмотре не работает.

Итак, чтобы включить автоматическое переключение темного режима для вашего веб-просмотра, вам необходимо проверить, в каком режиме работает ваша тема DayNight, а затем включить или отключить темный режим в веб-просмотре соответственно:

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, вы можете прочитать некоторую общую информацию о функции Force Dark в Android 10 ниже.

Функция Android 10 Force Dark

Force Dark для Android - это функция, представленная в Android 10 (API 29). Он позволяет любому приложению или действию, использующему только светлую тему и, следовательно, не поддерживающему темный режим сам по себе, автоматически затемняться системой, когда устройство работает в темном режиме.

Поскольку вы не можете контролировать, как эта функция применяет темный режим к вашим действиям и компонентам, ее рекомендуется использовать только в том случае, если вам нужно быстрое исправление для реализации темного режима. Если вы хотите правильно реализовать темный режим в своем приложении, вам необходимо использовать темную тему или тему DayNight с автоматическим переключением.

Чтобы включить принудительную темноту для вашего приложения, необходимо:

  • Использовать или наследовать световую тему (<item name="isLightTheme">true</item> необходимо указать для темы или ее предка)
  • <item name="android:forceDarkAllowed">true</item> необходимо установить для вашей темы или ее предка.
  • Вам нужно, чтобы ваш compileSdkVersion (и, возможно, targetSdkVersion) в вашем build.gradle был установлен как минимум на 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".

person Leon Lucardie    schedule 31.07.2020
comment
Поэтому я изменил свою тему на Theme.Material.Light и установил android:forceDarkAllowed для стилей и макета действий и использовал FORCE_DARK_AUTO, но это все равно не сработало. Я делал этот тест на Android 10. - person casolorz; 31.07.2020
comment
Я добавил к ответу дополнительную информацию о режиме Force Dark. Чтобы включить его, вам нужно только ваше приложение или действие, чтобы использовать или унаследовать от светлой темы, например (например) android:Theme.Material.Light и Theme.MaterialComponents.Light, и чтобы <item name="android:forceDarkAllowed">true</item> был установлен в теме. Вам не нужно устанавливать свойство для представлений в вашем макете (если вы не хотите отключить Force Dark для этих конкретных представлений). - person Leon Lucardie; 01.08.2020
comment
Вы совершенно правы, спасибо. Проблема, с которой я столкнулся, заключалась в том, что мой AppTheme также имел объявление на values-night, поэтому, когда я переключаюсь на Theme.MaterialComponents.Light, он не переключал его, поскольку мой телефон был в темном режиме. В любом случае, спасибо за прекрасное объяснение. Я собираюсь снова начать награждение, чтобы дать вам очки. - person casolorz; 02.08.2020