Как изменить цвет проверенного оттенка в 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);
Другие вопросы по тегам