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>
Jakob
la source
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;
}
rciovati
la source
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;
}
copolii
la source
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;
}
XYz Amos
la source
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
}
Kevin
la source
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;
}
Sotti
la source
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);
Esdras Lopez
la source
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()
    }
développeur android
la source