وقتی Compose را در برنامه موجودی معرفی میکنید، باید زمینههای XML Material خود را انتقال دهید تا از MaterialTheme برای مؤلفههای Compose استفاده کنید. این یعنی زمینهسازی برنامهتان دو منبع حقیقت خواهد داشت: زمینه مبتنی بر View و زمینه Compose. هرگونه تغییر در سبکبندی باید در چندین مکان انجام شود. وقتی
برنامهتان کاملاً به Compose منتقل شد، زمینهسازی XML را بردارید.
میتوانید از ابزار Material Theme Builder برای انتقال رنگها استفاده کنید.
وقتی انتقال از XML به Compose را شروع میکنید، زمینهسازی را به زمینهسازی Material 3 Compose انتقال دهید.
واژهنامه
| مدت | تعریف |
|---|---|
MaterialTheme |
تابع ترکیبپذیری که زمینهسازی (رنگها، تایپوگرافی، شکلها) را برای مؤلفههای Compose UI فراهم میکند. |
Shapes |
یک شیء Compose که برای تعریف شکلهای مؤلفه سفارشی برای MaterialTheme استفاده میشود. |
Typography |
یک شیء Compose که برای تعریف سبکهای نوشتار سفارشی (خانوادههای قلم، اندازهها، وزنها) برای MaterialTheme استفاده میشود. |
ColorScheme |
شیء Compose که برای تعریف آرایش رنگهای سفارشی برای MaterialTheme استفاده میشود. |
| زمینه XML | سیستم زمینهسازی Android که در فایلهای XML تعریف شده است و توسط سیستم «نما» استفاده میشود. |
محدودیتها
قبلاز انتقال، از محدودیتهای زیر آگاه باشید:
- این راهنما فقط روی انتقال به Material 3 تمرکز دارد. برای انتقال از سیستمهای طراحی جایگزین، به Material 2 یا سیستمهای طراحی سفارشی در Compose مراجعه کنید.
- هدف نهایی انتقال کامل به Compose است که امکان حذف زمینهسازی XML را فراهم میکند. این راهنما نحوه انتقال را توضیح میدهد، اما نحوه حذف نهایی زمینهسازی XML را توضیح نمیدهد.
مرحله ۱: ارزیابی سیستم طراحی
تشخیص اینکه کدام سیستم طراحی در پروژه XML View استفاده شده است. مسیر انتقال و مراحل لازم برای انتقال سیستم طراحی موجود به Material 3 در Compose را تجزیهوتحلیل کنید.
مرحله ۲: شناسایی فایلهای منبع زمینه
در XML، ?attr/colorPrimary را مینویسید. در Compose، با MaterialTheme.* به مقادیر زمینه دسترسی پیدا میکنید:
همه منابع و فایلهای XML لازم برای زمینهسازی را شناسایی و مکانیابی کنید: آرایش رنگها و شناسانندههای روشن و تیره، زمینهها، شکلها، ابعاد، نویسهنگاری، سبکها، و دیگر فایلهای مربوطه.
منابعی مانند رشتهها میتوانند همانطور که هستند دوباره استفاده شوند و نیازی به انتقال ندارند.
مرحله ۳: انتقال رنگها
اصل کلیدی: XML از رنگهای hex نامگذاریشده استفاده میکند.
Material 3 از نقشهای معنایی (مثلاً primary، onPrimary، surface) استفاده میکند.
نامگذاری رنگها براساس مقدار هگزادسیمال آنها را متوقف کنید؛ آنها را براساس نقششان نامگذاری کنید.
نمونهها:
| نام رنگ XML | نقش Material 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 منتقل کنید.
مرحله ۴: انتقال شکلها و حروفچینی سفارشی
اگر برنامهتان از شکلهای سفارشی استفاده میکند:
- در کد Compose، یک شیء
Shapesتعریف کنید تا تعاریف شکل XML شما را تکرار کند. این شیء
Shapesرا بهMaterialThemeخود ارائه دهید.برای جزئیات بیشتر، شکلها را ببینید.
- در کد Compose، یک شیء
اگر برنامهتان از تایپوگرافی سفارشی استفاده میکند:
- در کد Compose، شیء
Typographyرا در کد Compose تعریف کنید تا سبکهای نوشتار 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 |
مرحله ۵: انتقال سبکها (styles.xml)
سیستم سبکهای XML (styles.xml) سبکها و ظاهر موارد زیر را تعریف میکند:
- ابزارهها، مؤلفهها، زمینهها برای پنجرهها و کادرهای گفتگو
- نویسهنگاری
- طرحهای زمینه و همپوشانیها
- شکلها
«نماهای XML» و مؤلفهها چندین مشخصه را برای ایجاد سبک ترکیب میکنند. آنها سبکهایشان را از styles.xml به دو روش مختلف تنظیم میکنند:
- تنظیم «style="@style/...» بهطور مستقیم و صریح در XML View
- تنظیم سبک بهطور غیرمستقیم و ضمنی برای یک مؤلفه بهعنوان بخشی از یک «زمینه» بزرگتر (theme.xml)
سبکها معادل مستقیمی در Compose ندارند - درعوض سبکها بهعنوان: پارامترها یا اصلاحکنندهها به composableها، بااستفاده از Styles API جدید و آزمایشی تعریفشده در AppTheme، یا با ایجاد انواع composable لایهبندیشده و قابلاستفاده مجدد با سبک تعریفشده ارسال میشوند.
توابع @Composable جداگانهای ارائه دهید که براساس سبک و مؤلفه پایه نامگذاری شدهاند تا تفاوت در سبک و موارد استفاده برای آن مؤلفهها را نشان دهند.
- الگو: اگر عنصر XML از سبک سفارشی استفاده میکند
(مثلاً
style="@style/MyPrimaryButton")، سعی نکنید سبک را بهصورت درونخطی تکرار کنید. درعوض، پیشنهاد دهید که یک ترکیبپذیر خاص ایجاد شود. - مثال:
- XML:
<Button style="@style/MyPrimaryButton" ... /> - نوشتن:
MyPrimaryButton(onClick = { ... })
- XML:
- گروههای مشخصه رایج: اگر سبکی اصلاحکنندههای رایج را تنظیم میکند (مانند فاصلهگذاری داخلی + ارتفاع)، آنها را در یک ویژگی افزونه خوانا یا یک متغیر «اصلاحکننده» مشترک استخراج کنید.
نمونههای رایج
| XML | نوشتن |
|---|---|
Theme.Material3.* |
MaterialTheme(colorScheme, typography, shapes) { } |
TextAppearance.Material3.BodyMedium |
TextStyle(...) تعریفشده در 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 در 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 |
مرحله ۶: اعتبارسنجی انتقال زمینه
همیشه از مقادیر زمینه موجود از زمینه XML اصلی بهعنوان منبع حقیقت برای «زمینه Material» جدید در Compose استفاده کنید. برای حفظ ثبات نمانام و جلوگیری از پسرفتهای دیداری، هرگز مقادیر زمینه جدیدی را درطول انتقال ایجاد نکنید.
تأیید کنید که همه مقادیر جدید زمینه Compose با مقادیر XML موجود مطابقت داشته باشد. هیچ مقدار انتقالیافتهای را کدگذاری سخت نکنید.