Як програмно отримати акцентний колір?


87

Як можна отримати програмний колір акценту, встановлений у стилях, як показано нижче?

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

А як щодо версії підтримки?
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;
}

2
Це єдина відповідь, яка не покладається на імпорт класу програми R, який ідеально підходить для створення власних подань.
Аллан Велосо

12

Для тих, хто використовує 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

Розчин Kotlin:

    context.obtainStyledAttributes(TypedValue().data, intArrayOf(R.attr.colorAccent)).let {
        Log.d("AppLog", "color:${it.getColor(0, 0).toHexString()}")
        it.recycle()
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.