Jak programowo uzyskać kolor akcentujący?

87

Jak można programowo pobrać kolor akcentu ustawiony w stylach, takich jak poniżej?

    <item name="android:colorAccent">@color/material_green_500</item>
Jakob
źródło
3
Każdy, kto zagłosuje negatywnie, powinien czuć się naprawdę swobodnie, aby zamieścić swoje przemyślenia w komentarzu ...
Jakob

Odpowiedzi:

130

Możesz pobrać go z bieżącego motywu w następujący sposób:

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
źródło
A co z wersją wsparcia?
DariusL
4
To jest wersja wsparcia.
rciovati
czy możemy ustawić ciąg RGB w colorPrimary w styles.xml lub colors.xml ??
Tanveer Bulsari
2
To zwraca dla mnie liczbę ujemną. Czy to nadal właściwy sposób na uzyskanie akcentu kolorystycznego?
Naveed
1
Do czego odwołuje się typedValue.data?
GPack
45

To zadziałało również dla mnie:

public static int getThemeAccentColor (final Context context) {
    final TypedValue value = new TypedValue ();
    context.getTheme ().resolveAttribute (R.attr.colorAccent, value, true);
    return value.data;
}
copolii
źródło
Ten sam problem mam też w tym rozwiązaniu, wartość ujemna i wypada :(
batsheva
2
Wartość ujemna jest w porządku. To kolor!
copolii
ale moja aplikacja załamuje się z błędem nie znaleziono zasobu ... to się nie dzieje, gdy ustawię zwykły kolor! więc wartość nie jest w porządku
batsheva
Skąd więc pochodzi wartość ujemna, jeśli nie znaleziono zasobu? Mówię tylko, że 0xff2506ac (na przykład) jest liczbą ujemną i prawidłową wartością koloru.
copolii
2
Uzyskana wartość ujemna to rzeczywisty kolor, a nie identyfikator zasobu. Nie używaj go jako identyfikatora zasobu.
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
źródło
2
To jedyna odpowiedź, która nie polega na importowaniu klasy R aplikacji, co jest idealne do tworzenia niestandardowych widoków.
Allan Veloso,
12

Dla tych z Was, którzy używają Kotlin

fun Context.themeColor(@AttrRes attrRes: Int): Int {
    val typedValue = TypedValue()
    theme.resolveAttribute (attrRes, typedValue, true)
    return typedValue.data
}
Kevin
źródło
11

Mam statyczną metodę w klasie utils, aby pobrać kolory z bieżącego motywu. Najczęściej jest to colorPrimary, colorPrimaryDark i accentColor, ale możesz uzyskać znacznie więcej.

@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
źródło
7

Oto moje podejście do tego:

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

Stosowanie:

    String windowBackgroundHex = getThemeColorInHex(this, "windowBackground", android.R.attr.windowBackground);
    String primaryColorHex = getThemeColorInHex(this, "colorPrimary", R.attr.colorPrimary);
Esdras Lopez
źródło
2
String.format()Pomaga wyjaśnić, jak przerobić ujemnej wartości całkowitej na ciąg szesnastkowy koloru.
Mr-IDE
1
To znacznie lepsze / ogólne rozwiązanie niż przyjęta odpowiedź na to pytanie!
Nilesh Pawar
Przydatne również: stackoverflow.com/questions/6539879/…
Mr-IDE
1

Rozwiązanie Kotlin:

    context.obtainStyledAttributes(TypedValue().data, intArrayOf(R.attr.colorAccent)).let {
        Log.d("AppLog", "color:${it.getColor(0, 0).toHexString()}")
        it.recycle()
    }
programista Androida
źródło