如何在不指定颜色名称或资源ID的情况下访问colors.xml(R.color.name)

时间:2012-08-26 21:14:17

标签: android xml colors

Android程序员可以使用包含颜色名称和十六进制代码的XML文件,例如:

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <color name="White">#FFFFFF</color>
 <color name="Ivory">#FFFFF0</color>
 ...
 <color name="DarkBlue">#00008B</color>
 <color name="Navy">#000080</color>
 <color name="Black">#000000</color>
</resources>

我可以使用以下语法访问特定颜色:

TextView area1 = (TextView) findViewById(R.id.area);
area1.setBackgroundColor(Color.parseColor(getString(R.color.Navy)));

 area1.setBackgroundColor(Color.parseColor("Navy"));

Resources res = getResources();  
int rcol = res.getColor(R.color.Navy);  
area1.setBackgroundColor(rcol);  

如何将整个xml文件中的颜色读入颜色名称的String []和颜色资源的int [](例如,R.color.Navy),而不必指定每个颜色名称或资源ID ?

3 个答案:

答案 0 :(得分:5)

使用反射API它相当简单(我很久以前就有类似drawable-id的问题),但是很多有经验的用户说,“对dalvik的反思真的很慢”,所以要警告! / p>

//Get all the declared fields (data-members):
Field [] fields = R.color.class.getDeclaredFields();

//Create arrays for color names and values
String [] names = new String[fields.length];
int [] colors = new int [fields.length];

//iterate on the fields array, and get the needed values: 
try {
    for(int i=0; i<fields.length; i++) {
        names [i] = fields[i].getName();
        colors [i] = fields[i].getInt(null);
    }
} catch (Exception ex) { 
    /* handle exception if you want to */ 
}

然后,如果您有这些数组,那么您可以从中创建一个Map以便于访问:

Map<String, Integer> colors = new HashMap<String, Integer>();

for(int i=0; i<hexColors.length; i++) {
    colors.put(colorNames[i], hexColors[i]);
}

答案 1 :(得分:0)

我认为您必须将color.xml文件移动到/ asset目录中。您将不得不“手动”解析XML,并且无法使用R.color。*语法。 (除非您选择复制文件)

答案 2 :(得分:0)

您可以在R.colors上使用内省来查找所有字段名称和相关值。

R.colors.getClass().getFields()会为您提供所有颜色的列表。

在每个字段上使用getName()将为您提供所有颜色名称的列表,getInt()将为您提供每种颜色的值。