2016-04-07 5 views
0

Ich möchte die Tönungsfarbe einer CheckedTextView dynamisch ändern, wenn der Status der Ansicht checked ist. Ich bin mir ziemlich sicher, dass ich das erreichen kann, indem ich setCheckMarkTintList auf dem CheckedTextView rufe. Um dies zu tun, brauche ich eine ColorStateList, aber das Problem ist, ich möchte alle Farben für jeden Zustand der CheckedTextView, mit Ausnahme der checked Zustand beibehalten.So ändern Sie die überprüfte Tönungsfarbe einer CheckedTextView mit Hexadezimalwert

So kann ich die ColorStateList der CheckedTextView erhalten, aber ich weiß nicht, von einer Art und Weise nur die Farbe für den checked Zustand zu ändern. Ich weiß, ich kann eine neue ColorStateList erstellen, aber wie stelle ich sicher, dass es alle Werte aus dem Original behält?

kann ich einen Zustand Liste wie folgt erstellen:

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 
} 

und eine Farbliste aus den Farben aus dem ursprünglichen ColorStateList erstellen:

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

Dies würde aber die Einzelstaaten nur decken .. Sie können auch Zustände wie new int[]{android.R.attr.state_enabled, android.R.attr.state_pressed, -android.R.attr.state_checked} kombinieren. Es wäre lächerlich zu versuchen, jeden möglichen Zustand zu berücksichtigen, also wie kann ich möglicherweise wissen, was das Original ColorStateList gesetzt hat? Gibt es einen einfacheren Weg, dies zu tun? Übertreibe ich es?

Antwort

0

es sieht aus wie Tönung in CheckedTextView ist ziemlich Buggy. Am Ende löste ich es durch Vertauschen Farben in onClickListener:

checkedTextView.setOnClickListener { 
    if (checkedTextView.isChecked) { 
     checkedTextView.checkMarkTintList = ColorStateList.valueOf(color1) 
    } else { 
     checkedTextView.checkMarkTintList = ColorStateList.valueOf(color2) 
    } 
} 

(Beispiel in Kotlin, Java ähnlich ist)