如何以编程方式创buildColorStateList?

我想创build一个ColorStateList编程使用这个:

 ColorStateList stateList = new ColorStateList(states, colors); 

但是我不确定这两个参数是什么。

根据文件:

 public ColorStateList (int[][] states, int[] colors) 

在API级别1中添加

创build一个ColorStateList,它返回从状态到颜色的指定映射。

有人可以解释我如何创build这个?

二维数组的状态是什么意思?

有关可用状态的列表,请参阅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); 

第一个维度是一组状态集合,第二个维度是状态集合本身。 colors数组列出了每个匹配状态集合的颜色,因此colors数组的长度必须与states数组的第一个维度相匹配(或者当状态为“used”时它将会崩溃)。 这里和例子:

 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) } ); 

不幸的是,没有一个解决scheme适合我。

  1. 如果您一开始没有设置按下状态,它将不会检测到它。
  2. 如果你设置它,那么你需要定义空状态来添加默认颜色
 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]; } } } } 

有时候这样就足够了:

 int colorInt = getResources().getColor(R.color.ColorVerificaLunes); ColorStateList csl = ColorStateList.valueOf(colorInt); 

如果你使用资源的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);