5

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

<?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?

4

3 回答 3

6

使用反射 API 非常简单(不久前我在 drawable-ids 上遇到过类似的问题),但是很多更有经验的用户说,“dalvik 上的反射真的很慢”,所以请注意!

//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]);
}
于 2012-08-26T21:43:41.367 回答
0

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

于 2012-08-26T21:42:24.860 回答
0

您可以使用自省R.colors来找出所有字段名称和相关值。

R.colors.getClass().getFields()会给你所有颜色的列表。

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

于 2012-08-26T21:47:12.007 回答