
Темная тема доступна в Android 10 (API level 29) и выше. Она имеет следующие преимущества:
- Значительно снижает энергопотребление в зависимости от технологии экрана устройства.
- Улучшает видимость для пользователей со слабым зрением и людей, чувствительных к яркому свету.
- Облегчает использование устройства в условиях слабого освещения.
Темная тема применяется к пользовательскому интерфейсу системы Android и приложениям, запущенным на устройстве.
Включить темную тему в Android 10 и выше можно тремя способами:
- Используйте системные настройки, перейдя в Настройки > Дисплей > Тема , чтобы включить темную тему.
- Используйте плитку быстрых настроек для переключения тем в области уведомлений, если она включена.
- На устройствах Pixel включите режим экономии батареи, чтобы одновременно включить темную тему. Другие устройства могут не поддерживать это поведение.
Инструкции по применению темной темы к веб-контенту с использованием компонента WebView см. в разделе Затемнение веб-контента в WebView .
Поддержите темную тему в вашем приложении
Для поддержки темной темы настройте тему вашего приложения (обычно она находится в res/values/styles.xml
так, чтобы она наследовала тему DayNight
:
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
Вы также можете использовать темную тему Material Components :
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
Это привязывает основную тему приложения к системным флагам ночного режима и устанавливает для приложения темную тему по умолчанию, если она включена.
Темы и стили
Избегайте использования жестко закодированных цветов или иконок, предназначенных для использования в светлой теме. Вместо этого используйте атрибуты темы или ресурсы, квалифицированные для ночного времени.
Для темной темы наиболее важны два атрибута:
-
?android:attr/textColorPrimary
: цвет текста общего назначения. Он почти черный в светлой теме и почти белый в темных темах. Он содержит отключенное состояние. -
?attr/colorControlNormal
: цвет значка общего назначения. Содержит отключенное состояние.
Мы рекомендуем использовать Material Design Components , поскольку его система тематизации цветов , например, атрибуты темы ?attr/colorSurface
и ?attr/colorOnSurface
, обеспечивает легкий доступ к подходящим цветам. Вы можете настроить эти атрибуты в своей теме.
Изменение тем в приложении
Вы можете разрешить пользователям менять тему приложения во время его работы. Ниже приведены рекомендуемые варианты:
- Свет
- Темный
- Системные настройки по умолчанию (рекомендуемый вариант по умолчанию)
Эти параметры напрямую соответствуют режимам AppCompat.DayNight
:
Свет:
MODE_NIGHT_NO
.Тёмный:
MODE_NIGHT_YES
.Системное значение по умолчанию:
MODE_NIGHT_FOLLOW_SYSTEM
.
Чтобы сменить тему, сделайте следующее:
На уровне API 31 и выше используйте
UiModeManager#setApplicationNightMode
чтобы сообщить системе, какую тему использует ваше приложение. Это позволяет системе сопоставлять тему во время заставки.На уровне API 30 и ниже для переключения темы используйте
AppCompatDelegate.setDefaultNightMode()
.
Сила Тьмы
В Android 10 реализована функция Force Dark , позволяющая разработчикам быстро реализовать темную тему без явной установки темы DayNight
.
Force Dark анализирует каждое представление вашего светлого приложения и автоматически применяет темную тему перед тем, как оно будет отрисовано на экране. Вы можете использовать сочетание Force Dark и собственной реализации, чтобы сократить время, необходимое для внедрения темной темы.
Приложения должны включить Force Dark, установив android:forceDarkAllowed="true"
в теме действия. Этот атрибут устанавливается для всех светлых тем, предоставляемых системой и AndroidX, таких как Theme.Material.Light
. При использовании Force Dark тщательно протестируйте свое приложение и исключите представления по мере необходимости.
Если ваше приложение использует темную тему, например Theme.Material
), Force Dark не применяется. Аналогично, если тема вашего приложения наследуется от темы DayNight
, Force Dark не применяется из-за автоматического переключения темы.
Отключить принудительное затемнение в представлении
Force Dark можно контролировать в определенных представлениях с помощью атрибута макета android:forceDarkAllowed
или с помощью setForceDarkAllowed()
.
Веб-контент
Для получения информации об использовании темных тем в веб-контенте см. Darken web content in WebView . Для примера темной темы, примененной к WebView, см. демо WebView на GitHub .
Лучшие практики
В следующих разделах приведены рекомендации по реализации темных тем.
Уведомления и виджеты
Для поверхностей пользовательского интерфейса, которые вы отображаете на устройстве, но не контролируете напрямую, убедитесь, что все используемые вами представления отражают тему хост-приложения. Два примера — уведомления и виджеты запуска.
Уведомления
Используйте системные шаблоны уведомлений, такие как MessagingStyle
. Это означает, что система несет ответственность за применение правильного стиля представления.
Виджеты и пользовательские представления уведомлений
Для виджетов запуска или если ваше приложение использует пользовательские представления содержимого уведомлений, протестируйте содержимое как на светлой, так и на темной теме.
Распространенные ошибки, на которые следует обратить внимание, включают следующее:
- Предположим, что цвет фона всегда светлый.
- Жесткое кодирование цветов текста.
- Установка жестко заданного цвета фона при использовании цвета текста по умолчанию.
- Использование рисуемого значка статического цвета.
Во всех этих случаях используйте соответствующие атрибуты темы вместо жестко заданных цветов.
Экраны запуска
Если у вашего приложения есть собственный экран запуска, вам может потребоваться изменить его так, чтобы он отражал выбранную тему.
Удалите все жестко заданные цвета, такие как цвета фона, программно установленные на белый цвет. Вместо этого используйте атрибут темы ?android:attr/colorBackground
.
Изменения конфигурации
Когда тема приложения меняется, либо через системные настройки, либо через AppCompat, это вызывает изменение конфигурации uiMode
. Это означает, что действия автоматически пересоздаются.
В некоторых случаях вам может понадобиться, чтобы приложение обрабатывало изменение конфигурации. Например, вы можете захотеть отложить изменение конфигурации, потому что воспроизводится видео.
Приложение может реализовать темную тему, объявив, что каждое Activity
может обрабатывать изменение конфигурации uiMode
:
<activity
android:name=".MyActivity"
android:configChanges="uiMode" />
Когда Activity
объявляет, что оно обрабатывает изменения конфигурации, его метод onConfigurationChanged()
вызывается при изменении темы.
Чтобы проверить текущую тему, приложения могут запустить следующий код:
Котлин
val currentNightMode = configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK when (currentNightMode) { Configuration.UI_MODE_NIGHT_NO -> {} // Night mode is not active, we're using the light theme. Configuration.UI_MODE_NIGHT_YES -> {} // Night mode is active, we're using dark theme. }
Ява
int currentNightMode = configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK; switch (currentNightMode) { case Configuration.UI_MODE_NIGHT_NO: // Night mode is not active, we're using the light theme break; case Configuration.UI_MODE_NIGHT_YES: // Night mode is active, we're using dark theme break; }