如何使用主题属性作为颜色选择器

时间:2015-01-25 19:39:55

标签: android android-styles

我想为我的文本字段定义一个颜色状态列表,默认情况下,当激活'时,它会使用primaryTextColor和colorAccent。我的定义:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:color="?android:attr/colorAccent" android:state_activated="true"/>

    <item android:color="?android:attr/textColorPrimary"/>

</selector>

这不起作用(我总是得到一些红色,我猜这是id作为argb颜色的解释)。

如何能够指定与主题相关的颜色?

2 个答案:

答案 0 :(得分:1)

我认为现在不可能使用XML。我知道Android框架只在Lollipop中添加了对可绘制资源中的主题属性的支持,并且它不能在API 21下工作。我相信颜色资源永远不会得到支持。

但是,你可以从代码中做到这一点!

final TypedArray attributes =
        itemView.getContext().obtainStyledAttributes(R.styleable.WowSdkSongViewHolder);
try {
    int colorAccent =
            attributes.getColor(R.styleable.WowSdkSongViewHolder_colorAccent, 0);
    final int textColorPrimary = attributes.getColor(
            R.styleable.WowSdkSongViewHolder_android_textColorPrimary, 0);

    title.setTextColor(new ColorStateList(
            new int[][] { ThemeUtils.ACTIVATED_STATE_SET, ThemeUtils.EMPTY_STATE_SET },
            new int[] { colorAccent, textColorPrimary }));
} finally {
    attributes.recycle();
}

首先,您需要像往常一样获取当前主题中的属性值。然后你必须创建一个ColorStateList对象。构造函数接受一个状态列表数组(实际上是状态数组,它的方式是int[][])和一组相应的颜色。然后,您可以在ColorStateList上设置此TextView setTextColor超载。

AppCompat在ThemeUtils中定义了一些方便的常量。但是,此类隐藏在内部包中,因此我建议您将所需内容复制到自己的ThemeUtils

答案 1 :(得分:0)

我知道这是一个旧帖子,但仍然如此。如果您的最低版本是 API 23 或更高版本,您可以使用主题属性甚至 alpha 属性。

来自official documentation

<块引用>

每一项都必须定义一个 android:color 属性,它可能是一个 HTML 样式的十六进制颜色,对颜色资源的引用,或 -- 在 API 23 中 及以上 -- 解析为颜色的主题属性。

从 API 23 开始,items 可以选择定义一个 android:alpha 属性来修改基色的不透明度。这个属性需要一个 0 到 1 之间的浮点值或主题属性 如此解决。物品的整体颜色由下式计算 将基色的 alpha 通道乘以 alpha 值。