Come ottenere il colore dell'accento a livello di programmazione?


87

Come si recupera il colore dell'accento impostato negli stili, come di seguito, a livello di programmazione?

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

3
Chiunque abbia un voto negativo dovrebbe sentirsi davvero libero di pubblicare i propri pensieri in un commento ...
Jakob

Risposte:


130

Puoi recuperarlo dal tema corrente in questo modo:

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

E la versione di supporto?
DariusL

4
Questa è la versione di supporto.
rciovati

possiamo impostare la stringa RGB in colorPrimary in styles.xml o colors.xml ??
Tanveer Bulsari

2
Questo sta restituendo un numero negativo per me. È ancora questo il modo valido per ottenere il colore dell'accento?
Navata il

1
A cosa fa riferimento typedValue.data?
GPack

45

Questo ha funzionato anche per me:

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

Ottengo lo stesso problema anche in questa soluzione, valore negativo, e cade :(
batsheva

2
Il valore negativo va bene. È un colore!
copolii

ma la mia applicazione si riduce con eroor nessuna risorsa trovata ... questo non accade quando metto un colore normale! quindi il valore non va bene
batsheva

Allora da dove viene il valore negativo se la risorsa non viene trovata? Tutto quello che sto dicendo è che 0xff2506ac (ad esempio) è un numero negativo e un valore di colore valido.
copolii

2
Il valore negativo che ottieni è il colore effettivo, non l'id della risorsa. Non utilizzarlo come ID risorsa.
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
Questa è l'unica risposta che non si basa sull'importazione della classe R dell'app, ideale per la creazione di visualizzazioni personalizzate.
Allan Veloso

12

Per quelli di voi che usano Kotlin

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

11

Ho un metodo statico su una classe utils per ottenere i colori dal tema corrente. La maggior parte delle volte è colorPrimary, colorPrimaryDark e accentColor, ma puoi ottenere molto di più.

@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

Ecco la mia opinione su questo:

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

Utilizzo:

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

2
La String.format()aiuta a spiegare come convertire il valore intero negativo in una stringa di colore esadecimale.
Mr-IDE

1
Questa è una soluzione molto migliore / generica rispetto alla risposta accettata per questa domanda!
Nilesh Pawar


1

Soluzione Kotlin:

    context.obtainStyledAttributes(TypedValue().data, intArrayOf(R.attr.colorAccent)).let {
        Log.d("AppLog", "color:${it.getColor(0, 0).toHexString()}")
        it.recycle()
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.