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

相关推荐
都叫我大帅哥5 小时前
Java JJWT 完全指南:从入门到生产级实践
java
前端开发张小七6 小时前
Java 学习笔记 · 第一课:基础语法与核心概念
java·后端
红尘伴蝶舞6 小时前
Android 17 局域网调试与 ACCESS_LOCAL_NETWORK 权限隔离实践
kotlin·测试·设计
ThsPool7 小时前
【ENVI二次开发学习整理 04】ENVI功能扩展与二次开发
java·前端·javascript
赤壁小虾7 小时前
【渲染流水线】[逐片元阶段]-[透明度测试]以UnityURP为例
java·前端·数据库
青山木8 小时前
Hot 100 --- 搜索插入位置
java·数据结构·算法·leetcode
Jul1en_8 小时前
【Claude Code Compact】源码级别的学习上下文压缩
java·前端·学习·github·ai编程
摇滚侠8 小时前
《SpringBoot 3:入门与应用实战》第 15 章 生产级特性 管理 Spring Boot 应用 阅读笔记
java·spring boot·笔记
fengci.8 小时前
Microweber CMS 未授权路径穿越漏洞(CVE-2026-65694)
android·开发语言·前端·学习·php
XWalnut9 小时前
SpringBoot快速入门
java·spring boot·后端