Тёмная тема доступна в Android 10 (уровень API 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, поскольку их система цветовых тем, например атрибуты темы ?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 есть функция автоматической тёмной темы, которая позволяет разработчикам быстро реализовать тёмную тему без явной настройки темы DayNight.
Она анализирует каждый экран приложения со светлой темой и автоматически применяет тёмную тему перед отрисовкой. Чтобы сократить время, необходимое для реализации тёмной темы, вы можете использовать сочетание автоматической тёмной темы и нативной реализации.
Чтобы включить автоматическую тёмную тему, в теме объекта activity нужно задать значение android:forceDarkAllowed="true". Этот атрибут задан во всех светлых темах, предоставляемых системой и AndroidX, например Theme.Material.Light. Если вы используете автоматическую тёмную тему, тщательно протестируйте приложение и при необходимости исключите некоторые представления.
Если в приложении используется тёмная тема, например Theme.Material, автоматическая тёмная тема не применяется. Аналогично, если тема приложения наследуется от темы DayNight, автоматическая тёмная тема не применяется из-за автоматического переключения тем.
Как отключить автоматическую тёмную тему для представления
Автоматическую тёмную тему можно настроить для определенных представлений с помощью атрибута макета android:forceDarkAllowed или метода setForceDarkAllowed().
Веб-контент
Информацию о том, как использовать тёмные темы в веб-контенте, можно найти в статье Затемнение веб-контента в WebView. Пример применения тёмной темы к WebView можно посмотреть в демоверсии WebView на GitHub.
Рекомендации
В следующих разделах приведены рекомендации по реализации тёмных тем.
Уведомления и виджеты
Для элементов интерфейса, которые вы показываете на устройстве, но не контролируете напрямую, убедитесь, что все используемые вами представления отражают тему основного приложения. Два примера – уведомления и виджеты панели запуска.
Уведомления
Используйте системные шаблоны уведомлений, например MessagingStyle. Это означает, что система отвечает за применение правильного стиля представления.
Виджеты и специальные уведомления
Если в вашем приложении есть виджеты для панели запуска или пользовательские представления контента уведомлений, протестируйте контент в светлой и тёмной темах.
Вот некоторые распространенные ошибки:
- Предполагается, что цвет фона всегда светлый.
- Задавать цвета текста в коде.
- Задание цвета фона в коде при использовании цвета текста по умолчанию.
- Используйте отрисовываемый значок со статичным цветом.
Во всех этих случаях используйте соответствующие атрибуты темы вместо жестко заданных цветов.
Заставки
Если в вашем приложении есть заставка, возможно, вам потребуется изменить ее, чтобы она соответствовала выбранной теме.
Удалите все цвета, заданные в коде, например цвет фона, программно установленный как белый. Вместо него используйте атрибут темы ?android:attr/colorBackground.
Изменения конфигурации
Когда тема приложения меняется в настройках системы или AppCompat, запускается изменение конфигурации uiMode. Это означает, что действия воссоздаются автоматически.
В некоторых случаях может потребоваться, чтобы приложение обрабатывало изменение конфигурации. Например, вы можете отложить изменение конфигурации, если воспроизводится видео.
Приложение может реализовать тёмную тему, объявив, что каждый элемент Activity может обрабатывать изменение конфигурации uiMode:
<activity
android:name=".MyActivity"
android:configChanges="uiMode" />
Если Activity объявляет, что обрабатывает изменения конфигурации, то при изменении темы вызывается метод onConfigurationChanged().
Чтобы проверить, какая тема используется, приложения могут выполнять следующий код:
Kotlin
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. }
Java
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; }