Comment obtenir une couleur d'accentuation par programmation?


87

Comment récupérer la couleur d'accentuation définie dans les styles, comme ci-dessous, par programmation?

    <item name="android:colorAccent">@color/material_green_500</item>

3
Toute personne qui vote à la baisse devrait se sentir très libre de publier ses pensées dans un commentaire ...
Jakob

Réponses:


130

Vous pouvez le récupérer à partir du thème actuel de cette manière:

private int fetchAccentColor() {
    TypedValue typedValue = new TypedValue();

    TypedArray a = mContext.obtainStyledAttributes(typedValue.data, new int[] { R.attr.colorAccent });
    int color = a.getColor(0, 0);

    a.recycle();

    return color;
}

Qu'en est-il de la version de support?
DariusL

4
Ceci est la version de support.
rciovati

pouvons-nous définir la chaîne RVB dans colorPrimary dans styles.xml ou colors.xml ??
Tanveer Bulsari

2
Cela renvoie un nombre négatif pour moi. Est-ce toujours le moyen valable d'obtenir la couleur d'accent?
Naveed

1
À quoi typedValue.data fait-il référence?
GPack

45

Cela a fonctionné pour moi aussi:

public static int getThemeAccentColor (final Context context) {
    final TypedValue value = new TypedValue ();
    context.getTheme ().resolveAttribute (R.attr.colorAccent, value, true);
    return value.data;
}

J'ai le même problème également dans cette solution, une valeur négative, et cela tombe :(
batsheva

2
La valeur négative est bien. C'est une couleur!
copolii

mais mon application se bloque avec eroor aucune ressource trouvée ... ce n'est pas arrivé quand je mets une couleur normale! donc la valeur n'est pas bonne
batsheva

Alors d'où vient la valeur négative si la ressource n'est pas trouvée? Tout ce que je dis, c'est que 0xff2506ac (par exemple) est un nombre négatif et une valeur de couleur valide.
copolii

2
La valeur négative que vous obtenez est la couleur réelle et non l'ID de la ressource. Ne l'utilisez pas comme identifiant de ressource.
copolii

28
private static int getThemeAccentColor(Context context) {
    int colorAttr;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        colorAttr = android.R.attr.colorAccent;
    } else {
        //Get colorAccent defined for AppCompat
        colorAttr = context.getResources().getIdentifier("colorAccent", "attr", context.getPackageName());
    }
    TypedValue outValue = new TypedValue();
    context.getTheme().resolveAttribute(colorAttr, outValue, true);
    return outValue.data;
}

2
C'est la seule réponse qui ne repose pas sur l'importation de la classe app R, idéale pour créer des vues personnalisées.
Allan Veloso

12

Pour ceux d'entre vous qui utilisent Kotlin

fun Context.themeColor(@AttrRes attrRes: Int): Int {
    val typedValue = TypedValue()
    theme.resolveAttribute (attrRes, typedValue, true)
    return typedValue.data
}

11

J'ai une méthode statique sur une classe utils pour obtenir les couleurs du thème actuel. La plupart du temps, il s'agit de colorPrimary, colorPrimaryDark et accentColor, mais vous pouvez en obtenir beaucoup plus.

@ColorInt
public static int getThemeColor
(
        @NonNull final Context context,
        @AttrRes final int attributeColor
)
{
    final TypedValue value = new TypedValue();
    context.getTheme ().resolveAttribute (attributeColor, value, true);
    return value.data;
}

7

Voici mon point de vue sur ceci:

public static String getThemeColorInHex(@NonNull Context context, @NonNull String colorName, @AttrRes int attribute) {
    TypedValue outValue = new TypedValue();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        context.getTheme().resolveAttribute(attribute, outValue, true);
    } else {
        // get color defined for AppCompat
        int appCompatAttribute = context.getResources().getIdentifier(colorName, "attr", context.getPackageName());
        context.getTheme().resolveAttribute(appCompatAttribute, outValue, true);
    }
    return String.format("#%06X", (0xFFFFFF & outValue.data));
}

Usage:

    String windowBackgroundHex = getThemeColorInHex(this, "windowBackground", android.R.attr.windowBackground);
    String primaryColorHex = getThemeColorInHex(this, "colorPrimary", R.attr.colorPrimary);

2
Les String.format()aide à expliquer comment convertir la valeur entière négative en une chaîne de couleur hexadécimale.
Mr-IDE

1
C'est une solution bien meilleure / générique que la réponse acceptée pour cette question!
Nilesh Pawar


1

Solution Kotlin:

    context.obtainStyledAttributes(TypedValue().data, intArrayOf(R.attr.colorAccent)).let {
        Log.d("AppLog", "color:${it.getColor(0, 0).toHexString()}")
        it.recycle()
    }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.