如何在Jetpack Compose中直接使用颜色资源?

52

我希望直接使用在colors.xml中定义的自定义颜色,而不是使用Material主题颜色或Jetpack提供的默认主题颜色。有没有简单的方法可以做到这一点?

2个回答

113
您可以使用colorResource()来加载颜色资源。
Text(
    text = "Hello World",
    color = colorResource(R.color.purple_200)
)

5
这确实行得通,但我认为这个想法是将你的颜色放在Colors.kt文件中,并且迁移到Jetpack Compose的好处之一就是能够摆脱我们所谓的那个可怕的XML。哈哈开心编码! - Joshua King
@JoshuaKing... colorResource(...) 的想法很好,因为它可以避免静态代码分析中出现的“魔数”问题。 - Marlon López
这对我有用。我只需要手动添加 import com.mypackagename.R - Rumit Patel

20
要在Jetpack Compose中使用颜色,推荐创建一个名为ui.theme的包,放在com.<domain_name>.<app_name>中。如果您创建了空的Compose项目,该包通常会默认存在。现在,如果您的项目中不存在Color.ktTheme.kt文件,请创建它们。

Color.kt文件中添加所需的颜色。

package com.<domain_name>.<app_name>.ui.theme

import androidx.compose.ui.graphics.Color

val Purple200 = Color(0xFFBB86FC)
val Purple500 = Color(0xFF6200EE)
val Purple700 = Color(0xFF3700B3)
val Teal200 = Color(0xFF03DAC5)
val Flower = Color(0xFF4CAF50)
val Deer = Color(0xFFFF5722)
val Mango = Color(0xFFFF9800)
val AppbarColor = Color(0xFF2196F3)

这里是我制作的可直接使用的Material颜色模板

使用颜色的三种常见方法:

方法1:直接使用颜色

import com.<domain_name>.<app_name>.ui.theme.*

Text(text = "Hello ", color = Flower)

方法 2:覆盖默认的 MaterialTheme 颜色

现在在 Theme.kt 中。

private val DarkColorPalette = darkColors(
    primary = Purple200,
    primaryVariant = Purple700,
    secondary = Teal200,
    onBackground = Flower //Custom color
)

private val LightColorPalette = lightColors(
    primary = Purple500,
    primaryVariant = Purple700,
    secondary = Teal200,
    onBackground = Deer //Custom color

    /* Other default colors to override
    background = Color.White,
    surface = Color.White,
    onPrimary = Color.White,
    onSecondary = Color.Black,
    onBackground = Color.Black,
    onSurface = Color.Black,
    */
)

@Composable
fun NotepadTheme(darkTheme: Boolean = isSystemInDarkTheme(), 
content:@Composable() () -> Unit) {
    val colors = if (darkTheme) {
        DarkColorPalette
    } else {
        LightColorPalette
    }

    MaterialTheme(
        colors = colors,
        typography = Typography,
        shapes = Shapes,
        content = content
    )
}

MainActivity.kt

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ColorApp()
        }
    }
}

@Composable
fun ColorApp() {
    ColorTheme {
        Surface(modifier = Modifier.fillMaxSize(),
            color = MaterialTheme.colors.background) {
            Greeting("Android")
        }
    }
}

@Composable
fun Greeting(name: String) {
    Text(text = "Hello $name!", color = MaterialTheme.colors.onBackground) //Using color
}

@Preview(
    showBackground = true, name = "Light mode",
    uiMode = Configuration.UI_MODE_NIGHT_NO or 
    Configuration.UI_MODE_TYPE_NORMAL
    )
@Preview(
    showBackground = true, name = "Night mode",
    uiMode = Configuration.UI_MODE_NIGHT_YES or 
    Configuration.UI_MODE_TYPE_NORMAL
)
@Composable
fun DefaultPreview() {
    ColorApp()
}

方法三:自定义主题(推荐方法)

Text(text = "Hello ", color = AppNameTheme.colors.customColor)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接