Как создать ColorStateList программно?

Я пытаюсь создать ColorStateList программно, используя это:

 ColorStateList stateList = new ColorStateList(states, colors); 

Но я не уверен, каковы два параметра.

Согласно документации:

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

Добавлено в API уровня 1

Создает ColorStateList, который возвращает указанное отображение из состояний в цвета.

Может кто-нибудь, пожалуйста, объясните мне, как это сделать?

В чем смысл двумерного массива для состояний?

Solutions Collecting From Web of "Как создать ColorStateList программно?"

См. 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); 

Первое измерение – это массив состояний, второй – сам набор состояний. Массив цветов отображает цвета для каждого подходящего набора состояний, поэтому длина массива цветов должна соответствовать первому размеру массива состояний (или он будет сбой при использовании состояния). Вот и пример:

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

надеюсь это поможет.

Пример EDIT: список состояний цвета 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) } ); 

К сожалению, ни одно из решений не работает для меня.

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

К сожалению, ни одно из решений не работает для меня.

  1. Если вы не настроите предварительно нажатое состояние, он не обнаружит его.
  2. Если вы установите его, вам нужно определить пустое состояние, чтобы добавить цвет по умолчанию

Это конструктор из исходного кода:

 /** * 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]; } } } } 

Если вы используете ресурс 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); 

Иногда этого будет достаточно:

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