2014-12-22 16 views
49

Come si può recuperare il colore dell'accento impostato negli stili, come di seguito, a livello di programmazione?Come ottenere il colore di accento programmaticamente?

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

Chiunque down-voto dovrebbe sentirsi molto liberi davvero per pubblicare i loro pensieri in commento ... – Jakob

risposta

90

È possibile recuperare 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; 
} 
+0

cosa circa la versione di sostegno? – DariusL

+3

Questa è la versione di supporto. – rciovati

+0

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

27

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

Ho lo stesso problema anche in questa soluzione, valore negetive, e cade :( – batsheva

+1

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

+0

ma la mia aplicazione si abbassa con eroor no risorsa trovata ... non è una cosa felice quando inserisco un colore normale! quindi il valore non è corretto – batsheva

8

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; 
} 
13
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; 
} 
+1

Questa è l'unica risposta che non si basa sull'importazione della classe R dell'app, ideale per la creazione di visualizzazioni personalizzate. – Magritte

Problemi correlati