8

我正在开发一个 Android 项目,我有很多可绘制对象。这些drawables都被命名为icon_0.pngicon_1.png...。icon_100.png我想将这些可绘制对象的所有资源 ID 添加到整数的 ArrayList 中。(对于那些不了解android,只知道Java的人,我说的是静态变量,在一个类的静态内部类中,比如R.drawable.icon_0。所有这些静态变量都是整数。)

有没有比一个一个添加更有效的方法呢?喜欢

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(R.drawable.icon_1);
list.add(R.drawable.icon_2);
...
list.add(R.drawable.icon_100);

我可以以某种方式遍历它们吗?喜欢

for(int i=0; i<100; i++)
{
    list.add(R.drawable.icon_+i);  //<--- I know this doesn't work.
}

我无法控制这些静态整数所在的文件,也无法在运行时创建可绘制对象。

任何帮助,将不胜感激!

编辑

好的,我阅读了答案,但我有一个主要问题:我无权访问任何Context需要创建此 ID 数组/列表的实例(我在静态初始化程序块中执行此操作),因此 getResources()方法,建议的两个答案都行不通。有没有其他方法可以做到这一点?

4

4 回答 4

4

values在您的目录中的文件夹中创建一个 XML 文件resource

<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="myIcons">
    <item>@drawable/icon1</item>
    <item>@drawable/icon2</item>
    <item>@drawable/icon3</item>
    <item>@drawable/icon4</item>
    <item>@drawable/icon5</item>
    ...
    ...
</array>
</resources>

通过下面的代码,你会明白的。

Resources res = getResources();
TypedArray myIcons= res.obtainTypedArray(R.array.myIcons);  //mentioned  in the XML
for(int i=0; i<100; i++)
{
    Drawable drawable = myIcons.getDrawable(i);
    list.add(drawable);  
}
于 2012-08-05T07:08:30.590 回答
3

你可以试试这个。YourClassName.class.getFields();

Field[] fields = R.drawable.class.getFields();

您可以迭代所有字段,如果您的字段超出您的需要,您可能需要对其进行过滤。

于 2012-08-05T06:49:42.697 回答
0

一种方法是使用反射 API。

类似的东西...

Field[] fields =  R.drawable.class.getFields();
List<String> names = new ArrayList<String>(); 
for (Field field : fields) {
    if(field.getName().startsWith("icon")) 
       names.add(field.getName());    
}

int resid = getResources().getIdentifier(names.get(0), "drawable", "com.org.bla");

我没有测试过这个,但你明白了。

于 2012-08-05T06:52:20.300 回答
0

这是我最终做的事情:

icons = new ArrayList<Integer>(100);

//get all the fields of the R.drawable class.       
Field  [] fields = R.drawable.class.getDeclaredFields();

//create a temporary list for the names of the needed variables.
ArrayList <String> names = new ArrayList<String>(100);

//select only the desired names.
for(int i=0; i<fields.length; i++)
    if(fields[i].getName().contains("icon_"))
        names.add(fields[i].getName());

//sort these names, because later i want to access them like icons.get(0)
//what means i want icon_0.
Collections.sort(names);

try
{
    for(int i=0; i<names.size(); i++)
    {
        //get the actual value of these fields, 
        //and adding them to the icons list.
        int id = R.drawable.class.getField(names.get(i)).getInt(null);
        icons.add(id);
    }
}
catch(Exception ex)
{
    System.out.println(ex.getMessage());
}

我敢肯定,这不是最快的方法,但它正在工作。我会接受 AljoshaBre 的解决方案,因为他的回答使我找到了这个解决方案。

感谢大家的帮助!

于 2012-08-05T10:27:08.970 回答