【发布时间】:2014-12-08 00:23:45
【问题描述】:
问题说明了一切。
是否有机会以编程方式将 res/color 中的所有颜色加载到数组中?
如果您至少获得了ApplicationContext,则可以加载一种颜色,例如:
context.getResources().getColor(R.color.MyColor);
但我想将所有内容加载到一个数组中。
【问题讨论】:
问题说明了一切。
是否有机会以编程方式将 res/color 中的所有颜色加载到数组中?
如果您至少获得了ApplicationContext,则可以加载一种颜色,例如:
context.getResources().getColor(R.color.MyColor);
但我想将所有内容加载到一个数组中。
【问题讨论】:
这将遍历所有颜色引用并将实际颜色加载到稀疏数组中
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。
注意:运行测试看看使用这种方法实际节省了多少计算时间,如果可以避免,则不应使用反射。
【讨论】:
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();
}
}
检查Fielddocs中的类及其方法
编辑:
Field 可能有工作方法getInt,你可以试试,我现在不行:) 即使你没有在Log.i 中得到像这样"R.color.red" 的资源字符串,那么你可以使用将其转换为颜色这个方法:
private Color getColorResourceByName(String fgetname) {
int resId = getResources().getIdentifier(fgetname, "color", getPackageName());
return getString(resId);
}
将每个 Color 添加到 ArrayList 或任何您想要的集合,同时通过 Field 进行迭代
【讨论】: