XML 主题 → Compose Material3 主题
老写法(XML 主题)
res/values/colors.xml:
xml
<color name="primary">#6200EE</color>
<color name="primary_variant">#3700B3</color>
<color name="secondary">#03DAC6</color>
<color name="background">#FFFFFF</color>
<color name="surface">#FFFFFF</color>
<color name="on_primary">#FFFFFF</color>
res/values/themes.xml:
xml
<style name="Theme.MyApp" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<item name="colorPrimary">@color/primary</item>
<item name="colorPrimaryVariant">@color/primary_variant</item>
<item name="colorSecondary">@color/secondary</item>
<item name="android:colorBackground">@color/background</item>
</style>
问题在哪里
XML 主题系统完全无法复用到 Compose 里。如果你已经在逐步迁移到 Compose,需要对 View 体系和 Compose 体系各维护一套颜色/主题配置,两套容易不同步。
新写法(Compose Material3 Theme)
Color.kt:
kotlin
import androidx.compose.ui.graphics.Color
val Primary = Color(0xFF6200EE)
val PrimaryVariant = Color(0xFF3700B3)
val Secondary = Color(0xFF03DAC6)
val Background = Color(0xFFFFFFFF)
val Surface = Color(0xFFFFFFFF)
val OnPrimary = Color(0xFFFFFFFF)
// 深色模式
val PrimaryDark = Color(0xFFBB86FC)
val BackgroundDark = Color(0xFF121212)
val SurfaceDark = Color(0xFF1E1E1E)
Theme.kt:
kotlin
@Composable
fun MyAppTheme(
darkTheme: Boolean = isSystemInDarkTheme(),
content: @Composable () -> Unit
) {
val colorScheme = if (darkTheme) {
darkColorScheme(
primary = PrimaryDark,
secondary = Secondary,
background = BackgroundDark,
surface = SurfaceDark,
onPrimary = OnPrimary
)
} else {
lightColorScheme(
primary = Primary,
secondary = Secondary,
background = Background,
surface = Surface,
onPrimary = OnPrimary
)
}
MaterialTheme(
colorScheme = colorScheme,
content = content
)
}
使用:
kotlin
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyAppTheme {
// Compose 页面内容
}
}
}
}
一句话注意
Material3 的 lightColorScheme() / darkColorScheme() 需要导入 androidx.compose.material3,不是 material(Material2)。两个包名很像,别导错。
Compose 里的 Color(0xFF6200EE) 是 ARGB 格式,前两位 FF 是 alpha,后面六位是 RGB。从 XML 的值 #6200EE 转过来时前面要补 FF(完全不透明)。漏掉 alpha 位颜色就对不上。
如果项目是 View 和 Compose 混用,可以写一个工具类把同一个颜色值同时暴露给两套系统,避免维护两份。
Java Android 老项目迁移系列,持续更新中。