Answers:
有关可用状态的列表,请参见http://developer.android.com/reference/android/R.attr.html#state_above_anchor。
如果要为禁用,未聚焦,未选中状态等设置颜色,只需对状态取反即可:
int[][] states = new int[][] {
new int[] { android.R.attr.state_enabled}, // enabled
new int[] {-android.R.attr.state_enabled}, // disabled
new int[] {-android.R.attr.state_checked}, // unchecked
new int[] { android.R.attr.state_pressed} // pressed
};
int[] colors = new int[] {
Color.BLACK,
Color.RED,
Color.GREEN,
Color.BLUE
};
ColorStateList myList = new ColorStateList(states, colors);
{pressed}
,{focused}
,{-enabled}
,{}
。对于拨动它可能是{checked, pressed}
,{pressed}
,{checked, focused}
,{focused}
,{checked}
,{-enabled}
,{}
。或者拨动忽略重点:{checked, pressed}
,{pressed}
,{checked}
,{-enabled}
,{}
。
第一维是状态集的数组,第二维是状态集本身。colors数组列出了每个匹配状态集的颜色,因此colors数组的长度必须匹配状态数组的第一个维度(否则在“使用”状态时它将崩溃)。这里和例子:
ColorStateList myColorStateList = new ColorStateList(
new int[][]{
new int[]{android.R.attr.state_pressed}, //1
new int[]{android.R.attr.state_focused}, //2
new int[]{android.R.attr.state_focused, android.R.attr.state_pressed} //3
},
new int[] {
Color.RED, //1
Color.GREEN, //2
Color.BLUE //3
}
);
希望这可以帮助。
编辑示例:xml颜色状态列表,例如:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:color="@color/white"/>
<item android:color="@color/black"/>
</selector>
看起来像这样
ColorStateList myColorStateList = new ColorStateList(
new int[][]{
new int[]{android.R.attr.state_pressed},
new int[]{}
},
new int[] {
context.getResources().getColor(R.color.white),
context.getResources().getColor(R.color.black)
}
);
new int[]{}
最后-如此答案的最终代码块所示。我通常使用的唯一取反值是“启用”。另外一个例子,如果你想三种不同的颜色:“集中+按下”,“集中+未按”,“按下+不集中”,你可以简单地说{focused, pressed}
,{focused}
,{pressed}
。将使用第一个“ true”。
{pressed}
,{-pressed}
,{focused}
,{-focused
}。问题是,{pressed}
并{-pressed}
包括所有的可能性(键按下任一或未按),所以没有后面列出的颜色永远不会被使用。!
不幸的是,没有一种解决方案对我有用。
ColorStateList themeColorStateList = new ColorStateList(
new int[][]{
new int[]{android.R.attr.state_pressed},
new int[]{android.R.attr.state_enabled},
new int[]{android.R.attr.state_focused, android.R.attr.state_pressed},
new int[]{-android.R.attr.state_enabled},
new int[]{} // this should be empty to make default color as we want
},
new int[]{
pressedFontColor,
defaultFontColor,
pressedFontColor,
disabledFontColor,
defaultFontColor
}
);
这是源代码的构造函数:
/**
* Creates a ColorStateList that returns the specified mapping from
* states to colors.
*/
public ColorStateList(int[][] states, int[] colors) {
mStateSpecs = states;
mColors = colors;
if (states.length > 0) {
mDefaultColor = colors[0];
for (int i = 0; i < states.length; i++) {
if (states[i].length == 0) {
mDefaultColor = colors[i];
}
}
}
}
这是一个如何ColorList
在Kotlin中以编程方式创建示例:
val colorList = ColorStateList(
arrayOf(
intArrayOf(-android.R.attr.state_enabled), // Disabled
intArrayOf(android.R.attr.state_enabled) // Enabled
),
intArrayOf(
Color.BLACK, // The color for the Disabled state
Color.RED // The color for the Enabled state
)
)
从乔纳森·埃利斯(Jonathan Ellis)的答案出发,在Kotlin中,您可以定义一个辅助函数,使代码更加惯用且易于阅读,因此您可以编写以下代码:
val colorList = colorStateListOf(
intArrayOf(-android.R.attr.state_enabled) to Color.BLACK,
intArrayOf(android.R.attr.state_enabled) to Color.RED
)
colorStateListOf
可以这样实现:
fun colorStateListOf(vararg mapping: Pair<IntArray, Int>): ColorStateList {
val (states, colors) = mapping.unzip()
return ColorStateList(states.toTypedArray(), colors.toIntArray())
}
我也有:
fun colorStateListOf(@ColorInt color: Int): ColorStateList {
return ColorStateList.valueOf(color)
}
这样我就可以调用相同的函数名称,而不管它是选择器还是单色。
我用于创建的构建器类 ColorStateList
private class ColorStateListBuilder {
List<Integer> colors = new ArrayList<>();
List<int[]> states = new ArrayList<>();
public ColorStateListBuilder addState(int[] state, int color) {
states.add(state);
colors.add(color);
return this;
}
public ColorStateList build() {
return new ColorStateList(convertToTwoDimensionalIntArray(states),
convertToIntArray(colors));
}
private int[][] convertToTwoDimensionalIntArray(List<int[]> integers) {
int[][] result = new int[integers.size()][1];
Iterator<int[]> iterator = integers.iterator();
for (int i = 0; iterator.hasNext(); i++) {
result[i] = iterator.next();
}
return result;
}
private int[] convertToIntArray(List<Integer> integers) {
int[] result = new int[integers.size()];
Iterator<Integer> iterator = integers.iterator();
for (int i = 0; iterator.hasNext(); i++) {
result[i] = iterator.next();
}
return result;
}
}
使用示例
ColorStateListBuilder builder = new ColorStateListBuilder();
builder.addState(new int[] { android.R.attr.state_pressed }, ContextCompat.getColor(this, colorRes))
.addState(new int[] { android.R.attr.state_selected }, Color.GREEN)
.addState(..., some color);
if(// some condition){
builder.addState(..., some color);
}
builder.addState(new int[] {}, colorNormal); // must add default state at last of all state
ColorStateList stateList = builder.build(); // ColorStateList created here
// textView.setTextColor(stateList);
如果您使用资源Colors.xml
int[] colors = new int[] {
getResources().getColor(R.color.ColorVerificaLunes),
getResources().getColor(R.color.ColorVerificaMartes),
getResources().getColor(R.color.ColorVerificaMiercoles),
getResources().getColor(R.color.ColorVerificaJueves),
getResources().getColor(R.color.ColorVerificaViernes)
};
ColorStateList csl = new ColorStateList(new int[][]{new int[0]}, new int[]{colors[0]});
example.setBackgroundTintList(csl);
getResources()
已被弃用,这是现在ContextCompat.getColor(this,R.color.colorname);
或ContextCompat.getColor(getActivity(),R.color.colorname);
用于在片段的使用
new int[0]
(作为第一个参数列表中的元素)是一个零长度数组,它表示设置默认颜色。这是唯一的元素,这意味着将色调应用于按钮的所有状态。这等效new int[]{}
于Roger Alien的回答。