XML 主题 → Compose Material3 主题

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 老项目迁移系列,持续更新中。

相关推荐
景熙55234 小时前
15.Java 8 Stream 流入门到实战
java·开发语言·数据结构
wno7044 小时前
Spring Security权限控制
java·python·spring
杨运交5 小时前
[071][验证码模块]基于Spring拦截器的验证码认证设计思想
java·后端·spring
Geek-Chow5 小时前
CountDownLatch in Java
java
SL_staff5 小时前
从RBAC到场景化授权:《无忧·企业文档》三级权限模型的技术实践解析
java·开源·产品
传奇开心果编程6 小时前
【springboot基础语法学与练】第 1 课:从零开始
java·spring boot·后端·学习
SL_staff6 小时前
财务系统慎用低代码?从数据模型闭环看合规落地的技术实践
java·低代码·全栈
滕州市燕猫虎计算机科技工作室个体工商户6 小时前
IDEA:Command line is too long
java·ide·intellij-idea
BoomHe6 小时前
Android Framework 文件应用移植到 AndroidStudio
android
步行cgn7 小时前
Spring p 命名空间注入详解
java·前端·spring