【问题标题】:How to reference theme attributes in Jetpack Compose?如何在 Jetpack Compose 中引用主题属性?
【发布时间】:2020-07-18 16:44:32
【问题描述】:

所以在目前的andriod开发中,如果我们需要在主题中引用一个颜色集,我们可以简单地这样做:(在布局xml中)

....
    <TextView
        ...
        android:textColor="?attr/colorPrimary"
        .../>
....

如果我在主题中设置蓝色。我会在上面的 textview 中得到那个颜色。

我想知道如何在Jetpack Compose 中做同样的事情。在Compose,我们这样做了,

MaterialTheme(...) {
    Column {
        Text(
            ...
            textStyle = TextStyle(color = ????) // How to I reference to the theme?
        )
    }
}

【问题讨论】:

标签: android android-theme android-jetpack-compose


【解决方案1】:

你可以使用类似的东西:

Text(text = "....",
     style = TextStyle(color = MaterialTheme.colors.primary))

【讨论】:

  • 如果我想引用维度属性怎么办,例如android.R.attr.actionBarSize?
  • @SơnPhan 你找到解决方案了吗?
  • 其实我没找到,所以在这里问stackoverflow.com/questions/71033751/…
【解决方案2】:

Compose 提供基于 Material 颜色规范的ColorPalette 来生成您的应用主题。它提供lightColorPalettedarkColorPalette分别用于定义明暗模式的主题。

val lightThemeColors = lightColorPalette(
    primary = Color(0xFFFFFFFF),
    primaryVariant = Color(0xFFFFFFFF),
    onPrimary = Color.Black,
    secondary = Color.Transparent,
    onSecondary = Color.White,
    background = Color.White,
    onBackground = Color(0xFF212121),
    surface = Color.White,
    onSurface = Color(0xFF212121),
    error = Color.Red,
    onError = Color.White
)
val darkThemeColors = darkColorPalette(
    primary = Color(0xFF000000),
    primaryVariant = Color(0xFF000000),
    onPrimary = Color.White,
    secondary = Color.White,
    onSecondary = Color.White,
    surface = Color(0xFF212121),
    background = Color(0xFF212121),
    onBackground = Color.White,
    onSurface = Color.White,
    error = Color.Red,
    onError = Color.White
)
MaterialTheme(
colors = if(isSystemInDarkTheme()) darkThemeColors else lightThemeColors
) {
    Column {
        Text(
        textStyle = TextStyle(color = MaterialTheme.colors.primary)
        )
    }
}

如果您想为您的主题添加更多自定义颜色,您可以使用带有扩展变量的ColorPalette,如下所示

@Composable
val ColorPalette.myColor: Color
    get() = if(!isLight) Color(0xFF424242) else Color.White

现在您可以使用MaterialTheme.colors.myColor 来包含。

如果你想包含来自 android 颜色 xml 的颜色,你可以使用 colorResource(id = R.color.anyName) 函数来实现。

【讨论】:

  • 我在当前稳定的撰写材料版本 1.0.3 中没有找到ColorPalette。在上述解决方案中,您必须使用 Colors 而不是 ColorPalette。当然@Composable 注释不是必需的。
猜你喜欢
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 2022-10-07
  • 2022-12-21
  • 2021-01-05
  • 2013-01-02
  • 2022-11-24
相关资源
最近更新 更多