【问题标题】:Programmatically loading all colors from res/color以编程方式从 res/color 加载所有颜色
【发布时间】:2014-12-08 00:23:45
【问题描述】:

问题说明了一切。

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

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

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

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

【问题讨论】:

    标签: android colors


    【解决方案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。

    注意:运行测试看看使用这种方法实际节省了多少计算时间,如果可以避免,则不应使用反射。

    【讨论】:

      【解决方案2】:
      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 进行迭代

      【讨论】:

      • 这将使用颜色参考编号而不是实际颜色加载数组。
      猜你喜欢
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      • 2020-02-19
      • 2015-07-01
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      • 2013-03-01
      相关资源
      最近更新 更多