В Android 10 и более поздних версиях приложение может поддерживать темную тему и автоматически переключаться между светлой и темной темами приложения в соответствии с системной темой. Чтобы соответствовать текущей теме приложения, веб-контент в WebView также может использовать светлый, темный стиль или стиль по умолчанию.
Поведение WebView взаимодействует с веб-стандартами prefers-color-scheme
и color-scheme
. Если это возможно, если вы создаете веб-контент, который хотите, чтобы ваше приложение отображалось в WebView, вам следует определить темную тему для вашего веб-сайта и реализовать prefers-color-scheme
, чтобы WebView мог сопоставлять тему веб-контента с темой вашего приложения.
В следующей таблице описано, как WebView отображает веб-содержимое в вашем приложении, в зависимости от стиля веб-содержимого и условий вашего приложения.
Условия приложения | Веб-контент, использующий prefers-color-scheme | Веб-контент, который не использует prefers-color-scheme |
---|---|---|
Приложение использует светлую тему, для isLightTheme установлено значение true или не установлено значение true. | WebView отображает контент со светлой темой, которая определил автор контента. | WebView отображает контент со стилем по умолчанию, определенным автором контента. |
Приложение использует Force Dark для алгоритмического применения темной темы к приложению. | WebView отображает контент с темной темой, которая определил автор контента. | Если это разрешено автором контента, WebView отображает контент с темной темой, созданной с использованием алгоритма. |
Приложение использует темную тему, для isLightTheme установлено значение false , и приложение не позволяет алгоритмическое затемнение для WebView. | WebView отображает контент с темной темой, которая определил автор контента. | WebView отображает контент со стилем по умолчанию, определенным автором контента. |
Приложение использует темную тему, для параметра isLightTheme установлено значение false , и приложение разрешает алгоритмическое затемнение для WebView . | WebView отображает контент с темной темой, которая определил автор контента. | Если это разрешено автором контента, WebView отображает контент с темной темой, созданной с использованием алгоритма. |
Контент-авторский стиль
Атрибут isLightTheme
приложения указывает, является ли тема приложения светлой или темной. WebView всегда устанавливает prefers-color-scheme
в соответствии с isLightTheme
. Если isLightTheme
имеет true
или не указано, то prefers-color-scheme
light
; иначе dark
.
Это означает, что если веб-контент использует prefers-color-scheme
и автор контента разрешает это, светлая или темная тема, определенная автором контента, всегда автоматически применяется к веб-контенту в соответствии с темой приложения.
Алгоритмическое затемнение
Чтобы охватить случаи, когда веб-контент не использует prefers-color-scheme
, ваше приложение может разрешить WebView при необходимости алгоритмически применять темную тему к отображаемому веб-контенту.
Если ваше приложение использует Force Dark на уровне приложения для алгоритмического применения темной темы к вашему приложению, см. следующий раздел, в котором описывается, как разрешить алгоритмическое затемнение веб-контента с помощью Force Dark .
Если ваше приложение не использует Force Dark, то, как ваше приложение определяет, когда разрешать алгоритмическое затемнение в WebView, зависит от целевого уровня API вашего приложения. Подробную информацию о приложениях для Android 13 или более поздней версии и приложениях для Android 12 или более ранней версии см. в следующих разделах.
Разрешите алгоритмическое затемнение веб-контента с помощью Force Dark
Если ваше приложение использует Force Dark на уровне приложения, WebView применяет алгоритмическое затемнение к веб-содержимому, если выполняются следующие условия:
- WebView и его родительские элементы поддерживают Force Dark.
- Текущая тема активности помечается как легкая, если для
isLightTheme
установлено значениеtrue
. - Автор веб-контента не отключает затемнение явным образом.
- Для приложений, предназначенных для Android 13 (уровень API 33) или более поздних версий, веб-контент не использует
prefers-color-scheme
. - Для приложений, ориентированных на Android 12 (уровень API 32) или ниже: приложение установило для параметра
forceDarkMode
WebView значениеFORCE_DARK_AUTO
, а для стратегии Force Dark — значениеDARK_STRATEGY_USER_AGENT_DARKENING_ONLY
.
WebView и все его родители могут разрешить принудительное темное использование View.setForceDarkAllowed()
. Значение по умолчанию берется из атрибута setForceDarkAllowed()
темы Android, которому также должно быть присвоено значение true
.
Режим Force Dark предназначен в первую очередь для обеспечения обратной совместимости в приложениях, которые не имеют собственной темной темы . Если ваше приложение использует Force Dark, мы рекомендуем добавить поддержку темной темы .
Разрешить алгоритмическое затемнение (приложения для Android 13 или более поздней версии)
Для приложений, которые не используют Force Dark на уровне приложения и ориентированы на Android 13 (уровень API 33) или выше, используйте метод AndroidX setAlgorithmicDarkeningAllowed()
и передайте true
чтобы указать, что WebView должен разрешать алгоритмическое затемнение. Этот метод имеет обратную совместимость с предыдущими версиями Android.
Затем WebView применяет алгоритмическое затемнение, если выполняются следующие условия:
- Веб-контент не использует
prefers-color-scheme
. - Автор веб-контента не отключает затемнение явным образом.
Разрешить алгоритмическое затемнение (приложения для Android 12 или более ранней версии)
Для приложений, которые не используют Force Dark на уровне приложения и ориентированы на Android 12 (уровень API 32) или ниже, используйте FORCE_DARK_ON
, чтобы разрешить алгоритмическое затемнение.
Используйте FORCE_DARK_ON
вместе с FORCE_DARK_OFF
, если ваше приложение предоставляет собственный метод переключения между светлой и темной темами, например переключаемый элемент в пользовательском интерфейсе или автоматический выбор на основе времени.
Чтобы проверить, поддерживается ли эта функция, добавьте следующие строки кода везде, где вы настраиваете объект WebView, например, в Activity.onCreate
:
Котлин
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { WebSettingsCompat.setForceDark(...) }
Ява
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { WebSettingsCompat.setForceDark(...); }
Если ваше приложение полагается на обнаружение изменений в системных настройках, ваше приложение должно явно прослушивать изменения темы и применять их к WebView с состояниями FORCE_DARK_ON
и FORCE_DARK_OFF
.
В следующем фрагменте кода показано, как изменить формат темы:
Котлин
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) { Configuration.UI_MODE_NIGHT_YES -> { WebSettingsCompat.setForceDark(myWebView.settings, FORCE_DARK_ON) } Configuration.UI_MODE_NIGHT_NO, Configuration.UI_MODE_NIGHT_UNDEFINED -> { WebSettingsCompat.setForceDark(myWebView.settings, FORCE_DARK_OFF) } else -> { // } } }
Ява
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { switch (getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) { case Configuration.UI_MODE_NIGHT_YES: WebSettingsCompat.setForceDark(myWebView.getSettings(), FORCE_DARK_ON); break; case Configuration.UI_MODE_NIGHT_NO: case Configuration.UI_MODE_NIGHT_UNDEFINED: WebSettingsCompat.setForceDark(myWebView.getSettings(), FORCE_DARK_OFF); break; } }
Настройте обработку темной темы
Вы также можете использовать API ForceDarkStrategy в AndroidX, чтобы контролировать, как затемнение применяется к данному WebView. Этот API применим только в том случае, если для параметра Force Dark установлено значение FORCE_DARK_ON
или FORCE_DARK_AUTO
.
Используя API, ваше приложение может использовать либо затемнение веб-темы, либо затемнение пользовательского агента:
- Затемнение веб-темы . Веб-разработчики могут применять
@media (prefers-color-scheme: dark)
для управления внешним видом веб-страницы в темном режиме. WebView отображает контент в соответствии с этими настройками. Подробнее о затемнении веб-темы см. в спецификации . - Затемнение пользовательского агента : WebView автоматически инвертирует цвета веб-страницы. Если вы используете затемнение пользовательского агента, запрос
@media (prefers-color-scheme: dark)
оценивается какfalse
.
Чтобы выбрать между двумя стратегиями, используйте следующий API:
Котлин
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK_STRATEGY)) { WebSettingsCompat.setForceDarkStrategy(...) }
Ява
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK_STRATEGY)) { WebSettingsCompat.setForceDarkStrategy(...); }
Поддерживаемые варианты стратегии:
DARK_STRATEGY_PREFER_WEB_THEME_OVER_USER_AGENT_DARKENING
: это опция по умолчанию. Хотя большинство браузеров рассматривают тег<meta name="color-scheme" content="dark light">
как необязательный, режим Android WebView по умолчанию требует, чтобы метатег учитывал медиа-запросыprefers-color-scheme
веб-страницы. Вы можете использовать WebViews с режимомDARK_STRATEGY_WEB_THEME_DARKENING_ONLY
, и в этом случае WebView всегда применяет медиа-запросы, даже если тег опущен.Однако мы рекомендуем веб-разработчикам добавлять тег
<meta name="color-scheme" content="dark light">
на свои веб-сайты, чтобы обеспечить правильное отображение контента в WebViews с конфигурацией по умолчанию.DARK_STRATEGY_USER_AGENT_DARKENING_ONLY
: так называемое «затемнение пользовательского агента», WebView игнорирует любое затемнение веб-страницы и применяет автоматическое затемнение.
Если ваше приложение отображает собственный веб-контент, который вы настроили с помощью медиа-запроса prefers-color-scheme
, мы рекомендуем DARK_STRATEGY_WEB_THEME_DARKENING_ONLY
чтобы гарантировать, что WebView использует пользовательскую тему.
Пример применения темной темы см. в демонстрации WebView на GitHub.