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 小时前
Android Gradle 缓存与文件目录深度解析
android·gradle·android studio
张不才4 小时前
CPU 100% 了怎么办?Java 性能排障的标准化操作
java·后端
shepherd1115 小时前
吞吐量提升 10 倍:高并发大批量数据处理任务的架构演进与性能调优
java·后端·架构
曲幽7 小时前
Termux里的二进制和脚本,到底怎么运行才不踩坑?Termux-service 保活妙招!
android·termux·nohup·services·wake-lock
plainGeekDev8 小时前
单例模式 → object 声明
android·java·kotlin
程序员陆业聪8 小时前
读者点单·03|Compose 与传统 View 混用的 12 个真实坑
android
程序员陆业聪8 小时前
读者点单·02|Android 启动优化实战:Trace 抓取→Application 编排→冷启动全流程拆解
android
Coffeeee9 小时前
帮你快速理解AI Agent之我想招个Android实习生
android·人工智能·agent
用户298698530149 小时前
Java 实现 Word 文档文本与图片提取的方法
java·后端