why custom state won't work with compound drawable?
- by schwiz
Hello I am trying to make a password registration widget that will show a little checkbox in the textbox when both password boxes match.  I decided to go about this by extending EditText to implement a valid and an empty state and then just use a state-list drawable to handle everything else. 
I followed the same method that the CompoundButton uses to add a custom state and everything seems to be right but the image will never change no matter what the state is (custom state or even state_focused etc)  
Is there some reason that the compound drawables of a TextView wouldn't work as a state-list drawable?  Or, am I doing something wrong?  
Here is attrs.xml
<resources>
<declare-styleable name="ValidyState">
    <attr name="state_valid"        format="boolean"/>
    <attr name="state_has_text"     format="boolean"/>
</declare-styleable>        
</resources>
my selector 
<selector xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res/com.schwiz.test">
<item android:drawable="@drawable/emptyspace"
      app:state_has_text="false"/> 
<item android:drawable="@drawable/ic_valid" 
      app:state_valid="true" 
      app:state_has_text="true"/>
<item android:drawable="@drawable/ic_invalid" 
      app:state_valid="false" 
      app:state_has_text="true"/>    
 </selector>
and in my overridden EditText class
    private static final int[] VALID_STATE_SET = {
        R.attr.state_valid
};
private static final int[] HASTEXT_STATE_SET = {
    R.attr.state_has_text
};
...
private void refreshDrawables(){
    Drawable[] drawables = getCompoundDrawables();
    for(int i = 0; i < drawables.length; i++){
        if(drawables[i] != null) {
            drawables[i].setState(getDrawableState());
        }
    }
    invalidate();
}
@Override
protected void drawableStateChanged() {
    super.drawableStateChanged();
    refreshDrawables();
}
@Override
protected int[] onCreateDrawableState(int extraSpace) {
    final int[] drawableState = super.onCreateDrawableState(extraSpace + 2);
    if(hasText){
        mergeDrawableStates(drawableState, HASTEXT_STATE_SET);
    }
    if(isValid){
        mergeDrawableStates(drawableState, VALID_STATE_SET);
    }
    return drawableState;
}