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

Swe*_*ain 4 android android-jetpack android-jetpack-compose

我想直接使用在colors.xml 类中定义的自定义颜色,而不使用Material 主题颜色或Jetpack 提供的默认主题。有什么直接的方法可以做到吗?

Vid*_*uri 20

要在 jetpack compose 中使用颜色,建议在com.<domain_name>.<app_name>中创建一个包ui.theme,如果您创建空的 compose 项目,该包可能会默认存在。现在,如果您的项目中不存在Color.ktTheme.kt kotlin 文件,请创建它们。

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)
Run Code Online (Sandbox Code Playgroud)

这里准备使用我制作的Material Color模板

有3种常见的颜色使用方法

方法一:直接使用颜色

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

Text(text = "Hello ", color = Flower)
Run Code Online (Sandbox Code Playgroud)

方法 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
    )
}
Run Code Online (Sandbox Code Playgroud)

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()
}
Run Code Online (Sandbox Code Playgroud)

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

Text(text = "Hello ", color = AppNameTheme.colors.customColor)
Run Code Online (Sandbox Code Playgroud)


Sau*_*rat 9

您可以使用colorResource()which 加载颜色资源。

Text(
    text = "Hello World",
    color = colorResource(R.color.purple_200)
)
Run Code Online (Sandbox Code Playgroud)

  • 这当然有效,但我认为这个想法是将您的颜色放在 Colors.kt 文件中,并且迁移到 Jetpack Compose 的部分好处是能够消除项目中我们称之为 XML 的糟糕东西。哈哈,编码愉快! (5认同)