เมื่อนำ Compose มาใช้ในแอปที่มีอยู่ คุณต้องย้ายข้อมูลธีม Material XML เพื่อใช้ MaterialTheme กับคอมโพเนนต์ Compose ซึ่งหมายความว่าการกำหนดธีมของแอปจะมีแหล่งข้อมูลที่เชื่อถือได้ 2 แหล่ง ได้แก่ ธีมที่อิงตาม View และธีม Compose คุณต้องทำการเปลี่ยนแปลงการจัดรูปแบบในหลายๆ ที่ เมื่อย้ายข้อมูลแอปไปยัง Compose อย่างสมบูรณ์แล้ว ให้นำการกำหนดธีม XML ออก
คุณสามารถใช้เครื่องมือ Material Theme Builder เพื่อย้ายข้อมูลสี
เมื่อเริ่มย้ายข้อมูลจาก XML ไปยัง Compose ให้ย้ายข้อมูลการกำหนดธีมไปยังการกำหนดธีม Material 3 Compose
อภิธานศัพท์
| คำศัพท์ | คำจำกัดความ |
|---|---|
MaterialTheme |
ฟังก์ชันที่ประกอบกันได้ซึ่งกำหนดธีม (สี การพิมพ์ รูปทรง) ให้กับคอมโพเนนต์ UI ของ Compose |
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 | บทบาท 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
ขั้นตอนที่ 4: ย้ายข้อมูลรูปทรงและการพิมพ์ที่กำหนดเอง
หากแอปใช้รูปทรงที่กำหนดเอง ให้ทำดังนี้
- กำหนดออบเจ็กต์
Shapeในโค้ด Compose เพื่อจำลองคำจำกัดความของรูปทรง XML ระบุออบเจ็กต์
Shapeนี้ให้กับMaterialThemeดูรายละเอียดเพิ่มเติมได้ที่ รูปทรง
- กำหนดออบเจ็กต์
หากแอปใช้การพิมพ์ที่กำหนดเอง ให้ทำดังนี้
- ในโค้ด Compose ให้กำหนดออบเจ็กต์
Typographyเพื่อจำลองรูปแบบข้อความและคำจำกัดความของฟอนต์ XML ระบุออบเจ็กต์
Typographyนี้ให้กับMaterialThemeดูรายละเอียดเพิ่มเติมได้ที่การพิมพ์
- ในโค้ด Compose ให้กำหนดออบเจ็กต์
| บทบาท 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 View และคอมโพเนนต์จะรวมแอตทริบิวต์หลายรายการเพื่อสร้างรูปแบบ โดยจะตั้งค่ารูปแบบจาก styles.xml ด้วย 2 วิธีที่แตกต่างกัน ดังนี้ 1. ตั้งค่า "style="@style/..." โดยตรงและอย่างชัดแจ้งใน XML View 2. ตั้งค่ารูปแบบโดยอ้อมและโดยนัยสำหรับคอมโพเนนต์ซึ่งเป็นส่วนหนึ่งของธีมที่ใหญ่ขึ้น (theme.xml)
รูปแบบไม่มีรายการที่เทียบเท่าโดยตรงใน Compose แต่จะส่งรูปแบบเป็นพารามิเตอร์ไปยังคอมโพเนนต์ที่ประกอบกันได้ ซึ่งกำหนดไว้ใน AppTheme หรือโดยการสร้างคอมโพเนนต์ที่ประกอบกันได้แบบเลเยอร์และใช้ซ้ำได้ด้วยรูปแบบที่กำหนด
ระบุฟังก์ชัน @Composable แยกต่างหากซึ่งตั้งชื่อตามรูปแบบและคอมโพเนนต์พื้นฐาน เพื่อแสดงความแตกต่างในการจัดรูปแบบและกรณีการใช้งานสำหรับคอมโพเนนต์เหล่านั้น
- รูปแบบ: หากองค์ประกอบ XML ใช้รูปแบบที่กำหนดเอง
(เช่น
style="@style/MyPrimaryButton") อย่าพยายามจำลองรูปแบบในบรรทัด แต่ให้แนะนำให้สร้างคอมโพเนนต์ที่ประกอบกันได้ที่เฉพาะเจาะจง - ตัวอย่าง
- XML:
<Button style="@style/MyPrimaryButton" ... /> - Compose:
MyPrimaryButton(onClick = { ... })
- XML:
- กลุ่มแอตทริบิวต์ทั่วไป: หากรูปแบบตั้งค่าตัวปรับแต่งทั่วไป (เช่น ระยะขอบภายใน + ความสูง) ให้แยกตัวปรับแต่งเหล่านั้นออกเป็นพร็อพเพอร์ตี้ส่วนขยายที่อ่านได้หรือตัวแปรตัวปรับแต่งที่แชร์
ตัวอย่างทั่วไป
| XML | Compose |
|---|---|
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: ตรวจสอบการย้ายข้อมูลธีม
ใช้ค่าธีมที่มีอยู่จากธีม XML เดิมเป็นแหล่งข้อมูลที่เชื่อถือได้สำหรับธีม Material ใหม่ใน Compose เสมอ อย่าสร้างค่าธีมใหม่ระหว่างการย้ายข้อมูล เพื่อรักษาความสอดคล้องของแบรนด์และหลีกเลี่ยงการถดถอยของภาพ
ตรวจสอบว่าค่าธีม Compose ใหม่ทั้งหมดตรงกับค่า XML ที่มีอยู่ อย่าฮาร์ดโค้ดค่าที่ย้ายข้อมูล