以编程方式加载res / color中的所有颜色

时间:2014-12-08 00:23:45

标签: android colors

这个问题说明了一切。

是否有机会以编程方式将res/color中的所有颜色加载到数组中?

如果您至少获得ApplicationContext,则可以加载一种颜色,例如:

context.getResources().getColor(R.color.MyColor);

但我想将所有内容加载到数组中。

2 个答案:

答案 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