我想为我的文本字段定义一个颜色状态列表,默认情况下,当激活'时,它会使用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颜色的解释)。
如何能够指定与主题相关的颜色?
答案 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 属性。
<块引用>每一项都必须定义一个 android:color 属性,它可能是一个 HTML 样式的十六进制颜色,对颜色资源的引用,或 -- 在 API 23 中 及以上 -- 解析为颜色的主题属性。
从 API 23 开始,items 可以选择定义一个 android:alpha 属性来修改基色的不透明度。这个属性需要一个 0 到 1 之间的浮点值或主题属性 如此解决。物品的整体颜色由下式计算 将基色的 alpha 通道乘以 alpha 值。