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