Gdy wprowadzisz Compose w istniejącej aplikacji, musisz przenieść motywy Material XML, aby używać MaterialTheme w komponentach Compose. Oznacza to, że motywy aplikacji będą miały 2 źródła informacji: motyw oparty na widokach i motyw Compose. Wszelkie zmiany w stylach trzeba będzie wprowadzać w kilku miejscach. Gdy aplikacja zostanie w pełni przeniesiona do Compose, usuń motywy XML.
Do przenoszenia kolorów możesz użyć narzędzia Material Theme Builder.
Gdy rozpoczniesz migrację z XML do Compose, przenieś motywy do motywów Material 3 Compose.
Słowniczek
| Termin | Definicja |
|---|---|
MaterialTheme |
Funkcja typu „composable”, która zapewnia motywy (kolory, typografia, kształty) komponentom interfejsu Compose. |
Shape |
Obiekt Compose używany do definiowania niestandardowych kształtów komponentów dla MaterialTheme. |
Typography |
Obiekt Compose używany do definiowania niestandardowych stylów tekstu (rodzin czcionek, rozmiarów, grubości) dla MaterialTheme. |
Color |
Obiekt Compose używany do definiowania niestandardowych schematów kolorów dla MaterialTheme. |
| Motyw XML | System motywów Androida zdefiniowany w plikach XML, używany przez system widoków. |
Ograniczenia
Zanim rozpoczniesz migrację, zapoznaj się z tymi ograniczeniami:
- Ten przewodnik koncentruje się tylko na migracji do Material 3. Informacje o migracji z alternatywnych systemów projektowania znajdziesz w sekcji Material 2 lub niestandardowe systemy projektowania w Compose.
- Ostatecznym celem jest pełna migracja do Compose, która umożliwia usunięcie motywów XML. Ten przewodnik wyjaśnia, jak przeprowadzić migrację, ale nie wyjaśnia, jak ostatecznie usunąć motywy XML.
Krok 1. Oceń system projektowania
Określ, który system projektowania jest używany w projekcie widoku XML. Przeanalizuj ścieżkę migracji i niezbędne kroki, aby przenieść istniejący system projektowania do Material 3 w Compose.
Krok 2. Określ źródłowe pliki motywów
W XML wpisujesz ?attr/colorPrimary. W Compose uzyskujesz dostęp do wartości motywu za pomocą MaterialTheme.*:
Zidentyfikuj i znajdź wszystkie zasoby i pliki XML niezbędne do motywów: jasne i ciemne schematy kolorów oraz kwalifikatory, motywy, kształty, wymiary, typografia, style i inne odpowiednie pliki.
Zasoby takie jak ciągi znaków można ponownie wykorzystać w niezmienionej postaci i nie trzeba ich przenosić.
Krok 3. Przenieś kolory
Główna zasada: XML używa nazwanych kolorów szesnastkowych.
Material 3 używa ról semantycznych (np.primary, onPrimary, surface). Przestań nazywać kolory według ich wartości szesnastkowych. Nadaj im nazwy według ich roli.
Przykłady:
| Nazwa koloru XML | Rola Material 3 |
|---|---|
colorPrimary |
primary |
colorPrimaryDark / colorPrimaryVariant |
primaryContainer lub secondary |
colorAccent |
secondary lub tertiary |
colorOnPrimary |
onPrimary |
android:colorBackground |
background |
colorSurface |
surface |
colorOnSurface |
onSurface |
colorError |
error |
colorOnError |
onError |
colorOutline |
outline |
colorSurfaceVariant |
surfaceVariant |
colorOnSurfaceVariant |
onSurfaceVariant |
Przenieś jasne i ciemne schematy kolorów z XML do ich odpowiedników w Material 3 Compose.
Krok 4. Przenieś niestandardowe kształty i typografię
Jeśli Twoja aplikacja używa niestandardowych kształtów:
- W kodzie Compose zdefiniuj obiekt
Shape, aby odtworzyć definicje kształtów XML. Podaj ten obiekt
ShapewMaterialTheme.Więcej informacji znajdziesz w sekcji Kształty.
- W kodzie Compose zdefiniuj obiekt
Jeśli Twoja aplikacja używa niestandardowej typografii:
- W kodzie Compose zdefiniuj obiekt
Typography, aby odtworzyć style tekstu i definicje czcionek XML. Podaj ten obiekt
TypographywMaterialTheme.Więcej informacji znajdziesz w sekcji Typografia.
- W kodzie Compose zdefiniuj obiekt
| Rola Compose | Nazwa 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 |
Krok 5. Przenieś style (styles.xml)
System stylów XML (styles.xml) definiuje style i wygląd: widżetów, komponentów, motywów okien i okien dialogowych; typografii; motywów i nakładek; kształtów.
Widoki i komponenty XML łączą wiele atrybutów, aby utworzyć styl. Ustawiają swoje style z pliku styles.xml na 2 sposoby: Ustawienie „style="@style/..." bezpośrednio i jawnie w widoku XML. Ustawienie stylu pośrednio i niejawnie dla komponentu jako części większego motywu (theme.xml).
Style nie mają bezpośredniego odpowiednika w Compose. Zamiast tego style są przekazywane jako parametry do funkcji kompozycyjnych, zdefiniowane w AppTheme lub przez utworzenie warstwowych, wielokrotnego użytku wariantów kompozycyjnych ze zdefiniowanym stylem.
Podaj oddzielne funkcje @Composable nazwane zgodnie ze stylem i komponentem podstawowym, aby wskazać różnicę w stylach i przypadkach użycia tych komponentów.
- Wzorzec: jeśli element XML używa stylu niestandardowego
(np.
style="@style/MyPrimaryButton"), nie próbuj odtworzyć stylu w tekście. Zamiast tego zaproponuj utworzenie konkretnej funkcji kompozycyjnej. - Przykład:
- XML:
<Button style="@style/MyPrimaryButton" ... /> - Compose:
MyPrimaryButton(onClick = { ... })
- XML:
- Typowe grupy atrybutów: jeśli styl ustawia typowe modyfikatory (np. padding + height), wyodrębnij je do czytelnej właściwości rozszerzenia lub współdzielonej zmiennej Modifier.
Typowe przykłady
| XML | Compose |
|---|---|
Theme.MaterialComponents.* |
MaterialTheme(colorScheme, typography, shapes) { } |
TextAppearance.Material3.BodyMedium |
TextStyle(...) zdefiniowany w 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 w ComponentDefaults.ComponentColors() |
android:textColor |
contentColor w ComponentDefaults.ComponentColors() |
cornerRadius |
shape = RoundedCornerShape(X.dp) |
android:elevation |
elevation = ComponentDefaults.elevation(defaultElevation = X.dp) |
android:padding |
contentPadding = PaddingValues(...) lub Modifier.padding() |
android:minHeight |
Modifier.heightIn(min = X.dp) |
strokeColor + strokeWidth |
border = BorderStroke(width, color) |
android:textSize |
fontSize = X.sp w TextStyle |
Krok 6. Sprawdź migrację motywu
Zawsze używaj istniejących wartości motywu z oryginalnego motywu XML jako źródła informacji o nowym motywie Material w Compose. Podczas migracji nigdy nie wymyślaj nowych wartości motywu, aby zachować spójność marki i uniknąć regresji wizualnych.
Sprawdź, czy wszystkie nowe wartości motywu Compose są zgodne z istniejącymi wartościami XML. Nie koduj na stałe żadnych przeniesionych wartości.