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

相关推荐
金銀銅鐵3 小时前
为什么枚举类中可以定义抽象方法
java·后端·ai编程
文丑颜不良啊4 小时前
LeetCode1941~1960题目解析
java·leetcode
txxzjmzlh5 小时前
SpringBoot 统⼀功能处理
java·spring boot·后端
nice_lcj5207 小时前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试
码农小河667 小时前
基于SSM+JSP+MySQL的在线医疗服务系统的设计与实现
java·开发语言·mysql
SL_staff8 小时前
从配置失效到逻辑复用:JVS-Logic 如何构建可治理的业务编排中枢
java·spring·产品
特立独行的猫A8 小时前
一份 Markdown 发十个平台:cspub 一稿多投
java·后端·python
文丑颜不良啊9 小时前
LeetCode1961~1980题目解析
java·leetcode
文丑颜不良啊9 小时前
LeetCode2001~2020题目解析
java·leetcode
用户3721574261359 小时前
Java 批量提取 Word 文档中的图片并保存到本地
java