web-dev-qa-db-fra.com

Comment créer ColorStateList par programme?

J'essaie de créer un ColorStateList par programme en utilisant ceci:

ColorStateList stateList = new ColorStateList(states, colors); 

Mais je ne sais pas quels sont les deux paramètres.

Selon la documentation:

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

Ajouté dans l'API niveau 1

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

Quelqu'un peut-il m'expliquer s'il vous plaît comment créer cela?

Quelle est la signification d'un tableau à deux dimensions pour les états?

127
Anukool

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

Si vous souhaitez définir des couleurs pour les états désactivés, non ciblés, non cochés, etc., annulez simplement 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);
291
Caner

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 répertorie les couleurs de chaque jeu d’états correspondant. Par conséquent, la longueur du tableau de couleurs doit correspondre à la première dimension du tableau d’états (sinon elle plantera lorsque l’état sera "utilisé"). Ici et 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 t'aides.

Exemple EDIT: une liste d’états de couleur 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)
        }
);
67
Su-Au Hwang

Parfois, cela suffira:

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

Malheureusement, aucune des solutions ne fonctionne pour moi.

  1. Si vous ne définissez pas l'état pressé au début, il ne le détectera pas.
  2. Si vous le définissez, vous devez définir un état vide pour ajouter une 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];
            }
        }
    }
}
16
Roger Alien

Voici un exemple de création d'un ColorList par programme dans 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
        )
)
8
Jonathan Ellis

Ma classe de constructeur pour create ColorStateList

private class ColorStateListBuilder {
    List<Integer> colors = new ArrayList<>();
    List<int[]> states = new ArrayList<>();

    public ColorStateListBuilder addState(int[] state, int color) {
        states.add(state);
        colors.add(color);
        return this;
    }

    public ColorStateList build() {
        return new ColorStateList(convertToTwoDimensionalIntArray(states),
                convertToIntArray(colors));
    }

    private int[][] convertToTwoDimensionalIntArray(List<int[]> integers) {
        int[][] result = new int[integers.size()][1];
        Iterator<int[]> iterator = integers.iterator();
        for (int i = 0; iterator.hasNext(); i++) {
            result[i] = iterator.next();
        }
        return result;
    }

    private int[] convertToIntArray(List<Integer> integers) {
        int[] result = new int[integers.size()];
        Iterator<Integer> iterator = integers.iterator();
        for (int i = 0; iterator.hasNext(); i++) {
            result[i] = iterator.next();
        }
        return result;
    }
}

Exemple d'utilisation

ColorStateListBuilder builder = new ColorStateListBuilder();
builder.addState(new int[] { Android.R.attr.state_pressed }, ContextCompat.getColor(this, colorRes))
       .addState(new int[] { Android.R.attr.state_selected }, Color.GREEN)
       .addState(..., some color);

if(// some condition){
      builder.addState(..., some color);
}
builder.addState(new int[] {}, colorNormal); // must add default state at last of all state

ColorStateList stateList = builder.build(); // ColorStateList created here

// textView.setTextColor(stateList);
3
Phan Van Linh

si vous utilisez la ressource Colors.xml

int[] colors = new int[] {
                getResources().getColor(R.color.ColorVerificaLunes),
                getResources().getColor(R.color.ColorVerificaMartes),
                getResources().getColor(R.color.ColorVerificaMiercoles),
                getResources().getColor(R.color.ColorVerificaJueves),
                getResources().getColor(R.color.ColorVerificaViernes)

        };

ColorStateList csl = new ColorStateList(new int[][]{new int[0]}, new int[]{colors[0]}); 

    example.setBackgroundTintList(csl);
2
David Hackro