我有一个包含许多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中获取颜色?
提前致谢!
答案 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;
}