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.