这个问题说明了一切。
是否有机会以编程方式将res/color
中的所有颜色加载到数组中?
如果您至少获得ApplicationContext
,则可以加载一种颜色,例如:
context.getResources().getColor(R.color.MyColor);
但我想将所有内容加载到数组中。
答案 0 :(得分:1)
这将迭代所有颜色引用并将实际颜色加载到稀疏数组
SparseIntArray colors = new SparseIntArray();
Field[] refs = R.color.class.getFields(); //your R
for (Field f : refs) {
try {
int ref = f.getInt(null);
int color = getApplicationContext().getResources().getColor(ref);
colors.put(ref, color);
} catch (Exception e) {
e.printStackTrace();
}
}
假设您有一个名为my_color
的颜色,您可以这样:
int color = colors.get(R.color.my_color);
有关创意的信息归@snachmsm所有。
注意:运行测试以查看使用此方法实际保存的计算时间,如果可以避免,则不应使用反射。
答案 1 :(得分:0)
Field[] colors = R.color.class.getFields(); //your R
for (Field f : colors) {
try {
Log.i("colors", "R.color." + f.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
在docs
中检查Field
类及其方法
编辑:
Field
可能有工作方法getInt
,您可以尝试,我现在不能:)即使您没有在"R.color.red"
内获得此Log.i
这样的资源字符串然后你可以使用这个方法将它转换为Color:
private Color getColorResourceByName(String fgetname) {
int resId = getResources().getIdentifier(fgetname, "color", getPackageName());
return getString(resId);
}
将Color
添加到ArrayList
或您想要的任何设置,同时迭代Field