从R.color以编程方式检索颜色

时间:2014-10-27 09:56:27

标签: android colors

我有一个包含许多TextView的ListView,一个TextView应该包含不同的背景颜色,具体取决于检索的数据。

因为我不想对颜色进行硬编码,所以我使用R.color来设置我的颜色。这很好用,但我必须手动检查每种颜色,因为我注意到能够像HashMap一样获得颜色。所以我的第一次尝试是这样的:

    switch(line) {
    case "1":
        lineColor = context.getResources().getColor(R.color.line1);
    case "2":
        lineColor = context.getResources().getColor(R.color.line2);
    ....
    ....
    }

这似乎远离干净的代码,所以我尝试使用String-Arrays采用不同的方法:

<string-array name="line_color_names">
    <item>1</item>
    <item>2</item>
    ....
</string-array>

<string-array name="line_color_values">
    <item>#e00023</item>
    <item>#ef9ec1</item>
    ....
</string-array>

在我的AdapterClass中,我刚刚创建了一个HashMap并将这个String-Arrays放在一起:

    String[] line_color_names = context.getResources().getStringArray(
            R.array.line_color_names);
    String[] line_color_values = context.getResources().getStringArray(
            R.array.line_color_values);

    lineColors = new HashMap<String, String>();
    for (int i = 0; i < line_color_names.length; i++) {
        lineColors.put(line_color_names[i], line_color_values[i]);
    }

所以我的问题是:这是实现这个目标的唯一途径还是另一个,理想情况是直接从R.color中获取颜色?

提前致谢!

2 个答案:

答案 0 :(得分:1)

您可以使用资源名称(R.color.foo)获取颜色ID并在运行时解决它:

public int getColorIdByResourceName(String name) {
  int color;
  try {
    Class res = R.color.class;
    Field field = res.getField( name );
    int color = field.getInt(null);
  } catch ( Exception e ) {
    e.printStackTrace();
  }
  return color;
}

然后

int colorId  = getColorIdByResourceName("foo21");
int colorVal = getResources().getColor(getColorIdByResourceName("foo21"));

答案 1 :(得分:0)

你的第二个解决方案似乎很好,并不完全是黑客攻击。你应该找到这个。 但是如果你动态获得你的颜色名称,那么这段代码对你来说很方便。

public static int getColorIDFromName(String name)
{
    int colorID = 0;

    if(name == null
            || name.equalsIgnoreCase("")
            || name.equalsIgnoreCase("null"))
    {
        return 0;
    }

    try
    {
        @SuppressWarnings("rawtypes")
        Class res = R.color.class;
        Field field = res.getField(name);
        colorID = field.getInt(null);
    }
    catch(Exception e)
    {
        Log.e("getColorIDFromName", "Failed to get color id." + e);
    }

    return colorID;
}