Gdy wprowadzasz Compose w istniejącej aplikacji, musisz przenieść motywy Material XML, aby używać MaterialTheme w przypadku komponentów Compose. Oznacza to, że motyw aplikacji będzie miał 2 źródła informacji: motyw oparty na widoku i motyw Compose. Wszelkie zmiany w stylu trzeba wprowadzać w wielu miejscach. Po pełnym przeniesieniu aplikacji do Compose usuń motywy XML.
Do przenoszenia kolorów możesz użyć narzędzia Material Theme Builder.
Gdy rozpoczynasz migrację z XML do Compose, przenieś motywy do motywów Material 3 Compose.
Słowniczek
| Okres obowiązywania | Definicja |
|---|---|
MaterialTheme |
Funkcja typu „composable”, która zapewnia motywy (kolory, typografię, kształty) komponentom interfejsu Compose. |
Shapes |
Obiekt Compose używany do definiowania niestandardowych kształtów komponentów dla elementu MaterialTheme. |
Typography |
Obiekt Compose używany do definiowania niestandardowych stylów tekstu (rodzin czcionek, rozmiarów, grubości) dla elementu MaterialTheme. |
ColorScheme |
Obiekt Compose używany do definiowania niestandardowych schematów kolorów dla aplikacji 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 dotyczy tylko migracji do Material 3. Informacje o migracji z alternatywnych systemów projektowania znajdziesz w artykułach Material 2 i Niestandardowe systemy projektowania w Compose.
- Ostatecznym celem jest pełna migracja do Compose, która umożliwia usunięcie motywów XML. W tym przewodniku wyjaśniono, jak przeprowadzić migrację, ale nie wyjaśniono, 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. Zidentyfikuj pliki źródłowe motywu
W języku XML zapisuje się to jako ?attr/colorPrimary. W Compose wartości motywu są dostępne za pomocą MaterialTheme.*:
Zidentyfikuj i zlokalizuj wszystkie zasoby i pliki XML niezbędne do tworzenia motywów: jasne i ciemne schematy kolorów oraz kwalifikatory, motywy, kształty, wymiary, typografię, style i inne odpowiednie pliki.
Zasoby takie jak ciągi znaków mogą być używane ponownie w niezmienionej postaci i nie trzeba ich przenosić.
Krok 3. Przenieś kolory
Podstawowa zasada: XML używa nazwanych szesnastkowych kodów kolorów.
Material 3 używa ról semantycznych (np. primary, onPrimary, surface).
Przestań nazywać kolory według ich kodu szesnastkowego – nazywaj je według ich roli.
Przykłady:
| Nazwa koloru w pliku 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ś ciemne i jasne schematy kolorów z XML do ich odpowiedników w Material 3 Compose.
Krok 4. Przenieś niestandardowe kształty i typografię
Jeśli aplikacja używa niestandardowych kształtów:
- W kodzie Compose zdefiniuj obiekt
Shapes, aby odtworzyć definicje kształtów XML. Przekaż ten obiekt
ShapesdoMaterialTheme.Więcej informacji znajdziesz w sekcji Kształty.
- W kodzie Compose zdefiniuj obiekt
Jeśli aplikacja używa niestandardowej typografii:
- W kodzie Compose zdefiniuj obiekt
Typography, aby odtworzyć style tekstu i definicje czcionek z pliku XML. Przekaż ten obiekt
TypographydoMaterialTheme.Więcej informacji znajdziesz w sekcji Typografia.
- W kodzie Compose zdefiniuj obiekt
| Rola tworzenia wiadomości | 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)
Style XML (styles.xml) definiują style i wygląd:
- widżety, komponenty, motywy okien i okien dialogowych;
- Typografia
- Motywy i nakładki
- Kształty
Widoki i komponenty XML łączą wiele atrybutów, aby utworzyć styl. Style są ustawiane w pliku styles.xml na 2 różne sposoby:
- Ustawienie „style="@style/..." bezpośrednio i jawnie w widoku XML.
- ustawianie stylu pośrednio i niejawnie dla komponentu w ramach większego motywu (theme.xml);
Style nie mają bezpośredniego odpowiednika w Compose. Zamiast tego są przekazywane jako parametry lub modyfikatory do funkcji kompozycyjnych przy użyciu nowego, eksperymentalnego interfejsu Styles API zdefiniowanego w AppTheme lub przez utworzenie warstwowych, wielokrotnego użytku wariantów funkcji kompozycyjnych ze zdefiniowanym stylem.
Podaj osobne funkcje typu „composable” nazwane zgodnie ze stylem i komponentem podstawowym, aby wskazać różnice 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ć tego stylu w tekście. Zamiast tego zasugeruj utworzenie konkretnego elementu kompozycyjnego. - Przykład:
- XML:
<Button style="@style/MyPrimaryButton" ... /> - Utwórz:
MyPrimaryButton(onClick = { ... })
- XML:
- Typowe grupy atrybutów: jeśli styl ustawia typowe modyfikatory (np. dopełnienie i wysokość), wyodrębnij je do czytelnej właściwości rozszerzenia lub udostępnionej zmiennej modyfikatora.
Typowe przykłady
| XML | Utwórz |
|---|---|
Theme.Material3.* |
MaterialTheme(colorScheme, typography, shapes) { } |
TextAppearance.Material3.BodyMedium |
TextStyle(...) zdefiniowane w: Typography(bodyMedium = ...) |
ShapeAppearance.*.SmallComponent |
Shapes(small = RoundedCornerShape(X.dp)) |
Widget.Material3.Button |
Button(colors = ButtonDefaults.buttonColors(...)) |
Widget.Material3.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 dotychczasowych wartości motywu z oryginalnego motywu XML jako źródła informacji o nowym motywie Material Theme w Compose. Podczas migracji nigdy nie twórz nowych wartości motywu, aby zachować spójność marki i uniknąć regresji wizualnej.
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.