在循环中按名称访问变量

时间:2012-08-05 06:40:56

标签: java android

我正在开发一个Android项目,我有很多可绘制的东西。这些drawable都被命名为icon_0.pngicon_1.png ...... icon_100.png。我想将这些drawable的所有资源id添加到Integers的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.
}

我无法控制这些静态整数所在的文件,我无法在运行时创建drawable。

任何帮助将不胜感激!

修改

好的,我读了答案,但我有一个主要问题:我无法访问任何需要创建此数组/ id列表的Context个实例(我在静态初始化器中执行此操作)块),所以getResources()方法,建议的两个答案不会起作用。还有其他方法吗?

4 个答案:

答案 0 :(得分:4)

values目录的resource文件夹中创建XML文件。

<?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);  
}

答案 1 :(得分:3)

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

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

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

答案 2 :(得分: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");

我没有对此进行测试,但你明白了。

答案 3 :(得分: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的解决方案,因为他的回答使我得到了这个解决方案。

感谢大家的帮助!