我正在开发一个Android项目,我有很多可绘制的东西。这些drawable都被命名为icon_0.png
,icon_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()方法,建议的两个答案不会起作用。还有其他方法吗?
答案 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的解决方案,因为他的回答使我得到了这个解决方案。
感谢大家的帮助!