При внедрении Compose в существующее приложение необходимо перевести XML-темы Material на использование MaterialTheme для компонентов Compose. Это означает, что у оформления вашего приложения будет два источника достоверной информации: тема на основе представления и тема Compose. Любые изменения в стилях необходимо вносить в нескольких местах. После полной миграции приложения на Compose удалите XML-тему.
Для переноса цветов можно использовать инструмент Material Theme Builder .
При начале миграции с XML на Compose, перенесите темы оформления на Material 3 Compose.
Глоссарий
| Срок | Определение |
|---|---|
MaterialTheme | Компонуемая функция, которая обеспечивает оформление (цвета, типографику, формы) компонентов Compose UI. |
Shape | Объект Compose, используемый для определения пользовательских форм компонентов для MaterialTheme . |
Typography | Объект Compose, используемый для определения пользовательских стилей текста (семейства шрифтов, размеры, толщина) для темы MaterialTheme . |
Color | Объект Compose, используемый для определения пользовательских цветовых схем для MaterialTheme . |
| XML-тема | Система оформления тем Android, определенная в XML-файлах и используемая системой View. |
Ограничения
Перед миграцией учитывайте следующие ограничения:
- Данное руководство посвящено только миграции на Material 3. Для миграции с альтернативных систем дизайна см. Material 2 или пользовательские системы дизайна в Compose .
- Конечная цель — полная миграция на Compose, что позволит отказаться от XML-тематики. В этом руководстве объясняется, как осуществить миграцию, но не объясняется, как окончательно удалить XML-тематику.
Шаг 1: Оцените систему проектирования.
Определите, какая система проектирования используется в проекте XML View. Проанализируйте путь миграции и необходимые шаги для переноса существующей системы проектирования в Material 3 в Compose.
Шаг 2: Определите исходные файлы темы.
В XML вы пишете ?attr/colorPrimary . В Compose вы получаете доступ к значениям темы с помощью MaterialTheme.* `.
Найдите и определите все XML-ресурсы и файлы, необходимые для оформления: светлые и темные цветовые схемы и параметры, темы, формы, размеры, типографику, стили и другие соответствующие файлы.
Такие ресурсы, как строки, можно использовать повторно в неизмененном виде, и их не нужно переносить.
Шаг 3: Перенос цветов
Ключевой принцип: XML использует именованные шестнадцатеричные значения цветов. Material 3 использует семантические роли (например, primary , onPrimary , surface ). Прекратите называть цвета по их шестнадцатеричным значениям; называйте их по их роли.
Примеры:
| XML-название цвета | Роль материала 3 |
|---|---|
colorPrimary | primary |
colorPrimaryDark / colorPrimaryVariant | primaryContainer или secondary |
colorAccent | secondary или tertiary |
colorOnPrimary | onPrimary |
android:colorBackground | background |
colorSurface | surface |
colorOnSurface | onSurface |
colorError | error |
colorOnError | onError |
colorOutline | outline |
colorSurfaceVariant | surfaceVariant |
colorOnSurfaceVariant | onSurfaceVariant |
Перенесите темную и светлую цветовые схемы из XML в их эквиваленты в Material 3 Compose.
Шаг 4: Перенос пользовательских фигур и типографики.
Если ваше приложение использует пользовательские фигуры:
- В коде Compose определите объект
Shape, чтобы воспроизвести ваши XML-определения фигур. Передайте этот объект
Shapeв вашуMaterialTheme.Для получения более подробной информации см. раздел «Формы» .
- В коде Compose определите объект
Если ваше приложение использует собственную типографику:
- В коде Compose определите объект
Typography, чтобы воспроизвести стили текста и определения шрифтов из XML-файла. Передайте этот объект
Typographyв вашуMaterialTheme.Более подробную информацию см. в разделе «Типографика» .
- В коде Compose определите объект
| Сочинить роль | XML-имя |
|---|---|
displayLarge | TextAppearance.Material3.DisplayLarge |
displayMedium | TextAppearance.Material3.DisplayMedium |
displaySmall | TextAppearance.Material3.DisplaySmall |
headlineLarge | TextAppearance.Material3.HeadlineLarge |
headlineMedium | TextAppearance.Material3.HeadlineMedium |
headlineSmall | TextAppearance.Material3.HeadlineSmall |
titleLarge | TextAppearance.Material3.TitleLarge |
titleMedium | TextAppearance.Material3.TitleMedium |
titleSmall | TextAppearance.Material3.TitleSmall |
bodyLarge | TextAppearance.Material3.BodyLarge |
bodyMedium | TextAppearance.Material3.BodyMedium |
bodySmall | TextAppearance.Material3.BodySmall |
labelLarge | TextAppearance.Material3.LabelLarge |
labelMedium | TextAppearance.Material3.LabelMedium |
labelSmall | TextAppearance.Material3.LabelSmall |
Шаг 5: Перенос стилей (styles.xml)
Система XML-стилей (styles.xml) определяет стили и внешний вид следующих элементов: 1. Виджетов, компонентов, тем для окон и диалоговых окон; 2. Типографики; 3. Тем и наложений; 4. Фигур.
XML-представления и компоненты объединяют несколько атрибутов для создания стиля. Они задают свои стили из файла styles.xml двумя разными способами: 1. Задавая "style="@style/..." напрямую и явно в XML-представлении; 2. Задавая стиль косвенно и неявно для компонента как часть более крупной темы (theme.xml).
В Compose нет прямого аналога для стилей — вместо этого стили передаются в качестве параметров компонуемым объектам, определенным в AppTheme, или путем создания многослойных, многократно используемых вариантов компонуемых объектов с определенным стилем.
Предоставьте отдельные функции `@Composable`, названные в соответствии со стилем и базовым компонентом, чтобы обозначить разницу в стиле и сценариях использования этих компонентов.
- Правило: если XML-элемент использует собственный стиль (например,
style="@style/MyPrimaryButton"), не пытайтесь воспроизвести этот стиль непосредственно в коде. Вместо этого предложите создать отдельный составной элемент. - Пример:
- XML:
<Button style="@style/MyPrimaryButton" ... /> - Compose:
MyPrimaryButton(onClick = { ... })
- XML:
- Общие группы атрибутов: Если стиль задает общие модификаторы (например, отступы + высота), вынесите их в читаемое свойство расширения или в общую переменную Modifier.
Распространенные примеры
| XML | Сочинить |
|---|---|
Theme.MaterialComponents.* | MaterialTheme(colorScheme, typography, shapes) { } |
TextAppearance.Material3.BodyMedium | TextStyle(...) определен в Typography(bodyMedium = ...) |
ShapeAppearance.*.SmallComponent | Shapes(small = RoundedCornerShape(X.dp)) |
Widget.MaterialComponents.Button | Button(colors = ButtonDefaults.buttonColors(...)) |
Widget.MaterialComponents.CardView | Card(shape=..., elevation=..., colors=...) |
Widget.*.TextInputLayout.OutlinedBox | OutlinedTextField(colors = OutlinedTextFieldDefaults.colors(...)) |
Widget.*.Chip.Filter | FilterChip(colors = FilterChipDefaults.filterChipColors(...)) |
Widget.*.Toolbar.Primary | TopAppBar(colors = TopAppBarDefaults.topAppBarColors(...)) |
Widget.*.FloatingActionButton | FloatingActionButton(containerColor = ...) |
backgroundTint | containerColor в ComponentDefaults.ComponentColors() |
android:textColor | contentColor в ComponentDefaults.ComponentColors() |
cornerRadius | shape = RoundedCornerShape(X.dp) |
android:elevation | elevation = ComponentDefaults.elevation(defaultElevation = X.dp) |
android:padding | contentPadding = PaddingValues(...) или Modifier.padding() |
android:minHeight | Modifier.heightIn(min = X.dp) |
strokeColor + strokeWidth | border = BorderStroke(width, color) |
android:textSize | fontSize = X.sp в TextStyle |
Шаг 6: Проверка миграции темы.
В Compose всегда используйте существующие значения темы из исходного XML-файла темы в качестве источника достоверной информации для новой темы Material. Никогда не придумывайте новые значения темы во время миграции, чтобы сохранить единообразие бренда и избежать визуальных регрессий.
Убедитесь, что все новые значения темы Compose соответствуют существующим значениям XML. Не задавайте жестко заданные значения, полученные в результате миграции.