Как организовать тему в приложении

Ответ

Для организации темы в Android приложении используйте Theme.AppCompat (или Theme.MaterialComponents для MD3) в styles.xml. Основные подходы:

  1. Базовые стили – определите родительскую тему в res/values/styles.xml:
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
    <item name="colorPrimary">@color/purple_500</item>
    <item name="colorOnPrimary">@color/white</item>
    <item name="colorSecondary">@color/teal_200</item>
</style>
  1. Ночная тема – добавьте альтернативы в res/values-night/:
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.Dark">
    <item name="colorPrimary">@color/purple_200</item>
</style>
  1. Динамическое переключение (Kotlin):
AppCompatDelegate.setDefaultNightMode(
    if (isDark) MODE_NIGHT_YES else MODE_NIGHT_NO
)

Ключевые атрибуты:

  • colorPrimary – основной брендовый цвет
  • colorSurface – фон компонентов
  • textColor – цвет текста

Для кастомизации используйте ThemeOverlay для отдельных элементов. Все цвета должны быть определены в colors.xml с day/night вариантами.

Ответ 18+ 🔞

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

Первым делом, ёпта, лезешь в этот файл styles.xml. Там тебе надо базовый стиль объявить, типа фундамент для всего приложения. Берёшь либо Theme.AppCompat, если ты старый консерватор, либо Theme.MaterialComponents, если хочешь модно и современно. Вот смотри, как это выглядит:

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
    <item name="colorPrimary">@color/purple_500</item>
    <item name="colorOnPrimary">@color/white</item>
    <item name="colorSecondary">@color/teal_200</item>
</style>

Видишь? colorPrimary — это твой главный цвет, которым всё красится: кнопки, тулбары, всякая хрень. colorOnPrimary — это цвет текста поверх этого основного цвета, чтобы читалось. А colorSecondary — это типа акцентный цвет, для переключателей и прочей мелочи. Без этого — пизда рулю, приложение будет как из 2002 года.

Дальше, чувак, ночная тема. Это сейчас обязательно, а то пользователи, пидарасы шерстяные, ночью глаза сожгут. Для этого создаёшь папку res/values-night/ и туда такой же файл styles.xml кидаешь. Только там родительскую тему на тёмную меняешь и цвета другие подбираешь, поспокойнее.

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.Dark">
    <item name="colorPrimary">@color/purple_200</item>
</style>

Система сама, хитрая жопа, будет смотреть, какой сейчас режим у пользователя в настройках телефона, и подставлять нужный файл. Красота!

А если хочешь дать юзеру самому кнопкой ткнуть и сменить тему прямо в приложении — вот тебе код на котлине, простой как три копейки:

AppCompatDelegate.setDefaultNightMode(
    if (isDark) MODE_NIGHT_YES else MODE_NIGHT_NO
)

Вызови эту штуку, и всё приложение перерисуется. Главное, не забудь recreate() активити, чтобы изменения сразу применились, а то будет волнение ебать, где результат.

Теперь про ключевые атрибуты, чтобы ты не тыкался как слепой кот:

  • colorPrimary — твой король, основной цвет бренда.
  • colorSurface — цвет фона для карточек, листов и прочих поверхностей. Очень важная хуйня.
  • textColor — ну тут и ежу понятно, цвет текста. Но он часто наследуется сам, если тему правильно выбрал.

Если нужно какую-то одну хрень покрасить по-особенному, не трогая всю тему, используй ThemeOverlay. Это как заплатка, налепил на виджет и всё.

И последнее, блядь, золотое правило: все цвета, которые ты тут используешь (@color/purple_500), должны быть объявлены в colors.xml. Причём в двух экземплярах: в обычной папке values для светлой темы и в values-night для тёмной. Иначе получится манда с ушами — в ночном режиме цвета не поменяются и будет пиздец. Всё, теперь ты теоретически подкован, осталось не накосячить на практике.