Как изменить цвет проверенного оттенка в CheckedTextView с шестнадцатеричным значением
Я хочу динамически изменить цвет оттенка CheckedTextView
когда состояние зрения checked
, Я уверен, что могу добиться этого, позвонив setCheckMarkTintList
на CheckedTextView
, Для этого мне нужен ColorStateList
, но проблема в том, что я хочу сохранить все цвета для каждого состояния CheckedTextView
кроме checked
государство.
Итак, я могу получить ColorStateList
из CheckedTextView
, но я не знаю способа изменить только цвет для checked
государство. Я знаю, что могу создать новый ColorStateList
, но как мне убедиться, что он сохраняет все значения из оригинала?
Я могу создать список состояний следующим образом:
int[][] states = new int[][] {
new int[]{android.R.attr.state_pressed},
new int[]{-android.R.attr.state_pressed},
new int[]{android.R.attr.state_focused},
new int[]{-android.R.attr.state_focused},
new int[]{android.R.attr.state_selected},
new int[]{-android.R.attr.state_selected},
new int[]{android.R.attr.state_checkable},
new int[]{-android.R.attr.state_checkable},
new int[]{android.R.attr.state_checked},
new int[]{-android.R.attr.state_checked},
new int[]{android.R.attr.state_enabled},
new int[]{-android.R.attr.state_enabled},
new int[]{android.R.attr.state_window_focused},
new int[]{-android.R.attr.state_window_focused},
new int[]{} // default state
}
И создать список цветов из цветов из оригинала ColorStateList
:
int[] colors = new int[] {
stateList.getColorForState(new int[]{android.R.attr.state_pressed}, stateList.getDefaultColor()),
stateList.getColorForState(new int[]{-android.R.attr.state_pressed}, stateList.getDefaultColor()),
stateList.getColorForState(new int[]{android.R.attr.state_focused}, stateList.getDefaultColor()),
stateList.getColorForState(new int[]{-android.R.attr.state_focused}, stateList.getDefaultColor()),
stateList.getColorForState(new int[]{android.R.attr.state_selected}, stateList.getDefaultColor()),
stateList.getColorForState(new int[]{-android.R.attr.state_selected}, stateList.getDefaultColor()),
stateList.getColorForState(new int[]{android.R.attr.state_checkable}, stateList.getDefaultColor()),
stateList.getColorForState(new int[]{-android.R.attr.state_checkable}, stateList.getDefaultColor()),
Color.parseColor(colorHexValue),
stateList.getColorForState(new int[]{-android.R.attr.state_checked}, stateList.getDefaultColor()),
stateList.getColorForState(new int[]{android.R.attr.state_enabled}, stateList.getDefaultColor()),
stateList.getColorForState(new int[]{-android.R.attr.state_enabled}, stateList.getDefaultColor()),
stateList.getColorForState(new int[]{android.R.attr.state_window_focused}, stateList.getDefaultColor()),
stateList.getColorForState(new int[]{-android.R.attr.state_window_focused}, stateList.getDefaultColor()),
stateList.getDefaultColor()
}
Но это будет охватывать только одиночные состояния... вы также можете объединить состояния, такие как new int[]{android.R.attr.state_enabled, android.R.attr.state_pressed, -android.R.attr.state_checked}
, Было бы смешно пытаться учесть каждое возможное состояние, так как я могу знать, что означает оригинал ColorStateList
установил? Есть ли более простой способ сделать это? Я обдумываю это?
3 ответа
Это изменяет цвет CheckedTextView с зеленого на любой указанный вами цвет.
android:drawableTint="@color/grey_text"
Это выглядит как тонировка в CheckedTextView
довольно глючит В конце я решил это, поменяв цвета в onClickListener
:
checkedTextView.setOnClickListener {
if (checkedTextView.isChecked) {
checkedTextView.checkMarkTintList = ColorStateList.valueOf(color1)
} else {
checkedTextView.checkMarkTintList = ColorStateList.valueOf(color2)
}
}
(пример в Kotlin, Java похож на)
если вам нужно изменить его программно, вы можете установить ColorStateList следующим образом:
int[] colors = new int[] {
color,
color,
color,
color
};
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
};
ColorStateList myList = new ColorStateList(states, colors);
checkedTextView.setCheckMarkTintList(myList);