2014-12-22 4 views
49

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

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

Любой вниз голосования должны чувствовать себя очень свободно действительно размещать свои мысли в комментариях ... – Jakob

ответ

90

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

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

насчет версии поддержки? – DariusL

+3

Это версия поддержки. – rciovati

+0

можем ли мы установить строку RGB в colorPrimary в styles.xml или colors.xml ?? –

27

Это работает для меня, как хорошо:

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

Я получаю такую ​​же проблему и в этом решении, значение negetive, и оно падает :( – batsheva

+1

Отрицательное значение в порядке. Это цвет! – copolii

+0

, но мое приложение прорывается вниз с eroor no найденный ресурс ... это не происходит, когда я добавляю обычный цвет! так что значение не является хорошим – batsheva

8

У меня есть статический метод класса 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; 
} 
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

Это единственный ответ, который не зависит от импорта класса приложения R, который идеально подходит для создания пользовательских представлений. – Magritte

Смежные вопросы