Как создать ColorStateList программно?
Я пытаюсь создать ColorStateList программно с помощью этого:
ColorStateList stateList = new ColorStateList(states, colors);
но я не уверен, что эти два параметра.
согласно документации:
public ColorStateList (int[][] states, int[] colors)
добавлено в API level 1
создает ColorStateList, который возвращает указанное сопоставление из состояний в цвета.
может кто-нибудь объяснить мне, как создать это?
в чем смысл двумерного массива для Штатов?
6 ответов:
см.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 должна соответствовать первому измерению массива состояний (или он рухнет, когда состояние "используется"). Вот и пример:
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) } );
иногда этого будет достаточно:
int colorInt = getResources().getColor(R.color.ColorVerificaLunes); ColorStateList csl = ColorStateList.valueOf(colorInt);
к сожалению, ни одно из решений не работает для меня.
- если вы сначала не установите нажатое состояние, он его не обнаружит.
- если вы установите его, вы должны определить пустое состояние, чтобы добавить цвет по умолчанию
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]; } } } }
мой класс builder для create
ColorStateListprivate 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);
Если вы используете ресурс цвет.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);
Comments