Ao introduzir o Compose em um app já existente, é necessário migrar os temas XML do Material
para usar MaterialTheme em componentes do Compose. Isso significa que os temas do seu app vão ter duas fontes da
verdade: o tema baseado na visualização e o tema do
Compose. Qualquer mudança no estilo precisa ser feita em vários lugares. Depois que
o app for totalmente migrado para o Compose, remova a estilização XML.
Use a ferramenta Material Theme Builder para migrar cores.
Ao iniciar a migração do XML para o Compose, migre a estilização para a estilização do Material 3 Compose.
Glossário
| Termo | Definição |
|---|---|
MaterialTheme |
A função combinável que fornece temas (cores, tipografia, formas) aos componentes da interface do Compose. |
Shape |
Um objeto do Compose usado para definir formas de componentes personalizados para um MaterialTheme. |
Typography |
Um objeto do Compose usado para definir estilos de texto personalizados (famílias, tamanhos e espessuras de fontes) para um MaterialTheme. |
Color |
Um objeto do Compose usado para definir esquemas de cores personalizados para MaterialTheme. |
| Tema XML | O sistema de temas do Android definido em arquivos XML, usado pelo sistema de visualização. |
Limitações
Antes de migrar, esteja ciente das seguintes limitações:
- Este guia se concentra apenas na migração para o Material 3. Para migrar de sistemas de design alternativos, consulte Material 2 ou Sistemas de design personalizados no Compose.
- O objetivo final é uma migração completa para o Compose, que permite a remoção da inclusão de temas XML. Este guia explica como migrar, mas não explica como remover o tema XML.
Etapa 1: avaliar o sistema de design
Identifique qual sistema de design é usado no projeto XML View. Analise o caminho de migração e as etapas necessárias para migrar o sistema de design existente para o Material 3 no Compose.
Etapa 2: identificar os arquivos de origem do tema
Em XML, você escreve ?attr/colorPrimary. No Compose, você acessa os valores de tema
com MaterialTheme.*:
Identifique e localize todos os recursos e arquivos XML necessários para a estilização: esquemas de cores claro e escuro e qualificadores, temas, formas, dimensões, tipografia, estilos e outros arquivos relevantes.
Recursos como strings podem ser reutilizados no estado em que se encontram e não precisam ser migrados.
Etapa 3: migrar cores
Princípio fundamental:o XML usa cores hexadecimais nomeadas.
O Material 3 usa funções semânticas (por exemplo, primary, onPrimary, surface).
Pare de nomear as cores pelo hexadecimal e nomeie-as pela função.
Exemplos:
| Nome da cor XML | Função do Material 3 |
|---|---|
colorPrimary |
primary |
colorPrimaryDark / colorPrimaryVariant |
primaryContainer ou secondary |
colorAccent |
secondary ou tertiary |
colorOnPrimary |
onPrimary |
android:colorBackground |
background |
colorSurface |
surface |
colorOnSurface |
onSurface |
colorError |
error |
colorOnError |
onError |
colorOutline |
outline |
colorSurfaceVariant |
surfaceVariant |
colorOnSurfaceVariant |
onSurfaceVariant |
Migre os esquemas de cores claras e escuras do XML para os equivalentes no Material 3 Compose.
Etapa 4: migrar formas e tipografia personalizadas
Se o app usa formas personalizadas:
- No código do Compose, defina um objeto
Shapepara replicar as definições de forma XML. Forneça esse objeto
Shapeao seuMaterialTheme.Para mais detalhes, consulte formas.
- No código do Compose, defina um objeto
Se o app usa tipografia personalizada:
- No seu código do Compose, defina um objeto
Typographypara replicar os estilos de texto e as definições de fontes XML. Forneça esse objeto
Typographyao seuMaterialTheme.Para mais detalhes, consulte tipografia.
- No seu código do Compose, defina um objeto
| Função de composição | Nome 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 |
Etapa 5: migrar estilos (styles.xml)
O sistema de estilos XML (styles.xml) define estilos e aparência de: 1. Widgets, componentes, temas para janelas e caixas de diálogo 2. Tipografia 3. Temas e sobreposições 4. Formas
As visualizações e os componentes XML combinam vários atributos para criar um estilo. Eles definem os estilos de styles.xml de duas maneiras diferentes: 1. Definir "style="@style/..." diretamente e explicitamente na visualização XML 2. Definir o estilo indireta e implicitamente para um componente como parte de um tema maior (theme.xml)
Os estilos não têm um equivalente direto no Compose. Em vez disso, eles são transmitidos como: parâmetros para elementos combináveis, definidos no AppTheme ou criando variações combináveis reutilizáveis em camadas com o estilo definido.
Forneça funções @Composable separadas nomeadas de acordo com o estilo e o componente de base para indicar a diferença no estilo e nos casos de uso desses componentes.
- Padrão:se um elemento XML usar um estilo personalizado
(por exemplo,
style="@style/MyPrimaryButton"), não tente replicar o estilo inline. Em vez disso, sugira a criação de um elemento combinável específico. - Exemplo:
- XML:
<Button style="@style/MyPrimaryButton" ... /> - Escrever:
MyPrimaryButton(onClick = { ... })
- XML:
- Grupos de atributos comuns:se um estilo definir modificadores comuns (como padding + altura), extraia-os para uma propriedade de extensão legível ou uma variável de modificador compartilhada.
Exemplos comuns
| XML | Escrever |
|---|---|
Theme.MaterialComponents.* |
MaterialTheme(colorScheme, typography, shapes) { } |
TextAppearance.Material3.BodyMedium |
TextStyle(...) definido em 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 em ComponentDefaults.ComponentColors() |
android:textColor |
contentColor em ComponentDefaults.ComponentColors() |
cornerRadius |
shape = RoundedCornerShape(X.dp) |
android:elevation |
elevation = ComponentDefaults.elevation(defaultElevation = X.dp) |
android:padding |
contentPadding = PaddingValues(...) ou Modifier.padding() |
android:minHeight |
Modifier.heightIn(min = X.dp) |
strokeColor + strokeWidth |
border = BorderStroke(width, color) |
android:textSize |
fontSize = X.sp em TextStyle |
Etapa 6: validar a migração do tema
Sempre use os valores de tema atuais do tema XML original como a fonte de verdade para o novo tema Material no Compose Nunca invente novos valores de tema durante a migração para manter a consistência da marca e evitar regressões visuais.
Verifique se todos os novos valores de tema do Compose correspondem aos valores XML atuais. Não codifique valores migrados.