2014-12-22 17 views
49

Wie würde man die in Styles, wie unten, programmierte Akzentfarbe holen?Wie Akzent Farbe programmgesteuert erhalten?

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

Jeder Abwärts Abstimmung in der Tat sehr frei fühlen sollte, ihre Gedanken in Kommentar zu schreiben ... – Jakob

Antwort

90

Sie können es aus dem aktuellen Thema holen auf diese Weise:

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

Was ist mit dem Support-Version? – DariusL

+3

Dies ist die Support-Version. – rciovati

+0

können wir RGB-Zeichenfolgen in colorPrimary in styles.xml oder colors.xml setzen? –

27

Dieser arbeitete für mich auch:

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

Ich bekomme das gleiche Problem auch in dieser Lösung, negetive Wert, und es fällt :( – batsheva

+1

Negativer Wert ist in Ordnung. Es ist eine Farbe! – copolii

+0

aber meine Anwendung zerbricht mit Eror nein resource found ... das passiert nicht, wenn ich eine reguläre Farbe anlege, also ist der Wert nicht gut – batsheva

8

Ich habe eine statische Methode auf einer utils-Klasse Holen Sie sich die Farben aus dem aktuellen Thema. Meistens ist es colorPrimary, colorPrimaryDark und accentColor, aber Sie können viel mehr bekommen.

@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

Dies ist die einzige Antwort, die nicht auf dem Importieren der App R-Klasse beruht, die sich ideal zum Erstellen benutzerdefinierter Ansichten eignet. – Magritte

Verwandte Themen