
Темная тема доступна в 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 предоставляет функцию Force Dark , позволяющую разработчикам быстро внедрить темную тему без явной установки темы DayNight .
Функция Force Dark анализирует каждый элемент вашего приложения со светлой темой и автоматически применяет темную тему перед его отображением на экране. Вы можете использовать сочетание Force Dark и нативной реализации, чтобы сократить время, необходимое для внедрения темной темы.
Для включения режима «Принудительное затемнение» приложения должны установить атрибут 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() .
Чтобы проверить текущую тему оформления, приложения могут выполнять следующий код:
Котлин
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; }
