Как программно получить цвет акцента?

88

Как программно получить набор цветов акцента в стилях, как показано ниже?

    <item name="android:colorAccent">@color/material_green_500</item>
Якоб
источник
3
Любой, кто проголосовал против, должен чувствовать себя вправе публиковать свои мысли в комментариях ...
Якоб

Ответы:

130

Вы можете получить его из текущей темы следующим образом:

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
источник
А как насчет версии поддержки?
DariusL
4
Это версия поддержки.
rciovati
можем ли мы установить строку RGB в colorPrimary в styles.xml или colors.xml ??
Tanveer Bulsari
2
Это возвращает мне отрицательное число. Это все еще действующий способ получить цвет акцента?
Naveed
1
На что ссылается typedValue.data?
GPack
45

Это сработало и для меня:

public static int getThemeAccentColor (final Context context) {
    final TypedValue value = new TypedValue ();
    context.getTheme ().resolveAttribute (R.attr.colorAccent, value, true);
    return value.data;
}
кополии
источник
У меня такая же проблема и в этом решении, отрицательное значение, и оно падает :(
batsheva
2
Отрицательное значение нормально. Это цвет!
copolii
но мое приложение ломается с eroor, ресурс не найден ... этого не происходит, когда я кладу обычный цвет! так что значение не в порядке
batsheva
Тогда откуда берется отрицательное значение, если ресурс не найден? Все, что я говорю, это то, что 0xff2506ac (например) - отрицательное число и допустимое значение цвета.
copolii
2
Полученное отрицательное значение - это фактический цвет, а не идентификатор ресурса. Не используйте его как идентификатор ресурса.
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 Амос
источник
2
Это единственный ответ, который не зависит от импорта класса R приложения, который идеально подходит для создания пользовательских представлений.
Аллан Велосо
13

Для тех из вас, кто использует Kotlin

fun Context.themeColor(@AttrRes attrRes: Int): Int {
    val typedValue = TypedValue()
    theme.resolveAttribute (attrRes, typedValue, true)
    return typedValue.data
}
Кевин
источник
11

У меня есть статический метод класса utils, чтобы получить цвета из текущей темы. В большинстве случаев это colorPrimary, colorPrimaryDark и accentColor, но вы можете получить гораздо больше.

@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

Вот мой взгляд на это:

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

Применение:

    String windowBackgroundHex = getThemeColorInHex(this, "windowBackground", android.R.attr.windowBackground);
    String primaryColorHex = getThemeColorInHex(this, "colorPrimary", R.attr.colorPrimary);
Эсдрас Лопес
источник
2
String.format()Помогает объяснить , как преобразовать отрицательное целое значение в шестнадцатеричном цвете строку.
Mr-IDE
1
Это гораздо лучшее / общее решение, чем принятый ответ на этот вопрос!
Nilesh Pawar
Также полезно: stackoverflow.com/questions/6539879/…
Mr-IDE
1

Котлинское решение:

    context.obtainStyledAttributes(TypedValue().data, intArrayOf(R.attr.colorAccent)).let {
        Log.d("AppLog", "color:${it.getColor(0, 0).toHexString()}")
        it.recycle()
    }
разработчик Android
источник