如何以编程方式获得强调色?


87

如何以编程方式获取如下样式中的强调色?

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

3
拒绝投票的任何人都应该感到非常自由,可以发表自己的想法发表评论……
Jakob 2014年

Answers:


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,2015年

4
这是支持版本。
rciovati 2015年

我们可以在styles.xml或colors.xml的colorPrimary中设置RGB字符串吗?
Tanveer Bulsari '11

2
这为我返回了一个负数。这仍然是获得强调色的有效方法吗?
Naved

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

但是我的应用程序崩溃了,或者没有找到资源...当我放置常规颜色时,这不会发生!因此值不正确
batsheva

如果找不到资源,那么负值从何而来?我只是说0xff2506ac(例如)是负数和有效的颜色值。
copolii

2
您获得的负值是实际颜色 而不是资源ID。不要将其用作资源ID。
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类的唯一答案,这是构建自定义视图的理想选择。
艾伦·韦洛索18'Feb

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


1

Kotlin解决方案:

    context.obtainStyledAttributes(TypedValue().data, intArrayOf(R.attr.colorAccent)).let {
        Log.d("AppLog", "color:${it.getColor(0, 0).toHexString()}")
        it.recycle()
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.