Java 在循环中按名称访问变量

Java 在循环中按名称访问变量,java,android,Java,Android,我在做一个Android项目,我有很多绘图工具。这些可绘制图形的名称都类似于图标0.png,图标1.png图标\u 100.png。我想将这些可绘图项的所有资源id添加到整数数组列表中。(对于那些不懂android,只懂Java的人,我说的是静态变量,在类的静态内部类中,比如R.drawable.icon\u 0。所有这些静态变量都是整数。) 有没有比逐个添加更有效的方法?像 ArrayList<Integer> list = new ArrayList<Integer>

我在做一个Android项目,我有很多绘图工具。这些可绘制图形的名称都类似于
图标0.png
图标1.png
<代码>图标\u 100.png。我想将这些可绘图项的所有资源id添加到整数数组列表中。(对于那些不懂android,只懂Java的人,我说的是静态变量,在类的静态内部类中,比如
R.drawable.icon\u 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);
ArrayList list=new ArrayList();
列表。添加(R.drawable.icon_1);
列表.添加(R.drawable.icon_2);
...
列表。添加(R.drawable.icon_100);
我可以通过某种方式循环它们吗?像

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

for(inti=0;i您可以试试这个。
YourClassName.class.getFields();

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


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

一种方法是使用反射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");
Field[]fields=R.drawable.class.getFields();
列表名称=新的ArrayList();
用于(字段:字段){
if(field.getName().startsWith(“图标”))
name.add(field.getName());
}
int resid=getResources().getIdentifier(names.get(0),“drawable”,“com.org.bla”);

我还没有对此进行测试,但您已经明白了。

资源
目录的
values
文件夹中创建一个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);  
}

@可抽出式/icon1
@可抽出式/icon2
@可拉拔/图标3
@可拉拔的/icon4
@可拉拔式/icon5
...
...
通过下面的代码,你会得到这个想法

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);  
}
Resources res=getResources();
TypedArray myIcons=res.obtainTypedArray(R.array.myIcons);//在XML中提到

对于(int i=0;i,以下是我最终要做的事情:

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());
}
icons=newarraylist(100);
//获取R.drawable类的所有字段。
Field[]fields=R.drawable.class.getDeclaredFields();
//为所需变量的名称创建临时列表。
ArrayList名称=新的ArrayList(100);
//仅选择所需的名称。

对于(int i=0;这是正确的解决方案。使用反射是目前为止最糟糕的方法。@Falmari想解释一下原因吗?嗨!谢谢你的回答,我真的很喜欢它。我唯一的问题是(我在问题中没有提到它),我需要创建的列表是一个静态字段,我只能在静态初始值设定项块中上载它,在该块中我无法访问任何上下文实例。这种情况下有什么想法吗?:(@iccthedral:reflection非常昂贵,而且类型也不安全。Android已经有了一种完全符合OP要求的方法。OP,你需要一个context.Period。你的示例只将整数添加到列表中,实际上不会加载任何可绘制内容。如果你真的需要它们,你应该尽早在应用程序中加载它们的整个应用程序的onCreate方法。也就是说,您的类扩展了
应用程序
@AljoshaBre,因为反射非常慢(特别是在Dalvik上)。您可以获得一个或两个resid。在本例中,我们谈论的是100。如果我没记错的话,
getIdentifier()
在内部也使用反射,这并不能使事情变得更好。请看一下和。尽管我要说的是“测量并做出自己的决定”。从我的经验来看,这听起来是个坏主意。谢谢!有没有办法,不用getResources()来做这件事函数?在我需要创建此列表的地方,我没有访问任何上下文的权限。哦,天哪,Dalvik的速度太慢了。我的不好,但是嘿-如果你缓存结果并使用
getIdentifier(…)
恰当地说,这个解决方案应该很好。但是,我还是会使用XML;正如Rahmathullah所展示的那样。好吧,好吧;但我希望您知道在Dalvik上使用反射API的所有优点和缺点。这是第二次或第三次,我看到反射API在运行,所以我对其优点/缺点一无所知,甚至不知道Dalvik的意思是什么。我只是不想使用xml方法,因为我必须键入的内容与手动将ID添加到列表中的内容一样多。因此,您能提供一些关于反射内容的来源吗?