230 votes

Comment créer ColorStateList de manière programmatique ?

J'essaie de créer un ColorStateList de façon programmatique en utilisant ceci :

ColorStateList stateList = new ColorStateList(states, colors); 

Mais je ne suis pas sûr de ce que sont ces deux paramètres.

Conformément à la documentation :

public ColorStateList (int[][] states, int[] colors) 

Ajouté dans l'API niveau 1

Crée une ColorStateList qui renvoie le mappage spécifié des états aux couleurs.

Quelqu'un peut-il m'expliquer comment créer cela ?

Quelle est la signification du tableau bidimensionnel pour les états ?

420voto

Caner Points 15625

Ver http://developer.Android.com/reference/Android/R.attr.html#state_above_anchor pour obtenir la liste des états disponibles.

Si vous voulez définir des couleurs pour les états désactivé, non focalisé, non coché, etc., il suffit de nier les états :

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);

140voto

tse Points 1923

Parfois, cela suffira :

int colorInt = getResources().getColor(R.color.ColorVerificaLunes);
ColorStateList csl = ColorStateList.valueOf(colorInt);

95voto

Su-Au Hwang Points 1726

La première dimension est un tableau d'ensembles d'états, la seconde est l'ensemble d'états lui-même. Le tableau de couleurs liste les couleurs pour chaque ensemble d'états correspondant, donc la longueur du tableau de couleurs doit correspondre à la première dimension du tableau d'états (ou il se plantera lorsque l'état sera "utilisé"). Voici un exemple :

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

J'espère que cela vous aidera.

Exemple d'EDIT : une liste d'états de couleurs en xml comme :

<?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>

ressemblerait à ceci

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

40voto

Jonathan Ellis Points 1591

Voici un exemple de la manière de créer une ColorList de manière programmatique en Kotlin :

val colorList = ColorStateList(
        arrayOf(
                intArrayOf(-android.R.attr.state_enabled),  // Disabled
                intArrayOf(android.R.attr.state_enabled)    // Enabled
        ),
        intArrayOf(
                Color.BLACK,     // The color for the Disabled state
                Color.RED        // The color for the Enabled state
        )
)

30voto

Roger Alien Points 802

Malheureusement, aucune de ces solutions ne fonctionne pour moi.

  1. Si vous ne définissez pas l'état enfoncé au début, il ne le détectera pas.
  2. Si vous le définissez, vous devez alors définir un état vide pour ajouter la couleur par défaut.

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

C'est le constructeur du code source :

/**
 * 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];
            }
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X