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)
}
);
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
)
)
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];
}
}
}
}
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);
8条答案
按热度按时间qlfbtfca1#
有关http://developer.android.com/reference/android/R.attr.html#state_above_anchor可用状态的列表,请参见www.example.com。
如果您想设置禁用、未聚焦、未选中等状态的颜色,只需取消这些状态:
mzaanser2#
有时这就足够了:
wvt8vs2t3#
第一个维度是状态集的数组,第二个维度是状态集本身。colors数组列出了每个匹配状态集的颜色,因此colors数组的长度必须与states数组的第一个维度匹配(否则当状态被“使用”时,它将崩溃)。下面是示例:
编辑示例:XML颜色状态列表,如:
会是这个样子
a14dhokn4#
下面是一个如何在Kotlin中以编程方式创建
ColorList
的示例:0s7z1bwu5#
不幸的是,没有一个解决方案对我有效。
1.如果你不设置按下状态在第一次它不会检测到它。
1.如果您设置了它,那么您需要定义空状态来添加默认颜色
这是源代码中的构造函数:
uemypmqf6#
借鉴answer by Jonathan Ellis,在Kotlin中可以定义一个helper函数,使代码更符合习惯,更容易阅读,因此可以编写如下代码:
colorStateListOf
可以这样实现:我还有:
这样我就可以调用相同的函数名,不管它是选择器还是单色。
gorkyyrv7#
我创建
ColorStateList
的构建器类示例使用
hyrbngr78#
如果您使用Colors.xml资源