Jak można programowo pobrać kolor akcentu ustawiony w stylach, takich jak poniżej?
<item name="android:colorAccent">@color/material_green_500</item>
Jak można programowo pobrać kolor akcentu ustawiony w stylach, takich jak poniżej?
<item name="android:colorAccent">@color/material_green_500</item>
Odpowiedzi:
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; }
źródło
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; }
źródło
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; }
źródło
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 }
źródło
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; }
źródło
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);
źródło
String.format()
Pomaga wyjaśnić, jak przerobić ujemnej wartości całkowitej na ciąg szesnastkowy koloru.Rozwiązanie Kotlin:
context.obtainStyledAttributes(TypedValue().data, intArrayOf(R.attr.colorAccent)).let { Log.d("AppLog", "color:${it.getColor(0, 0).toHexString()}") it.recycle() }
źródło