有没有一种方法可以迭代R.drawable



我在drawable中有很多图像,我希望将它们放入数组中。手动将它们放入数组将花费太长时间,无论是在时间上还是在代码上。我想知道是否有一种方法可以循环通过R.drawable,比如这样:

ArrayList<Integer> imgArr = new ArrayList<>();
for(int k=0; k<R.drawable.size(); k++) {
imgArr.add(R.drawable.get(k));
}

首先,您可能应该稍微了解R类:在这里阅读更多

简而言之:R类是一个动态生成的类,它包含内部类(如drawable类(。这些内部类包含多个Integer常量,这些常量链接到相应的资源

这意味着,由于这里的drawables被定义为R.drawable类的成员,我们需要使用反射来访问它们。首先,我们需要获得drawable子类的一个实例。不幸的是,这个类的构造函数是私有的,但我们可以使用更多的反射来解决这个问题:

Class<R.drawable> drawableClass = R.drawable.class;
R.drawable instance = (R.drawable) drawableClass.getConstructors()[0].newInstance();

接下来,我们创建一个ArrayList,对于R.drawable类中声明的每个字段,我们获得在实例中设置的值(因为它们是常量,所以是正确的值(,并将其添加到列表中:

List<Integer> drawables = new ArrayList<>();
for (Field field :
drawableClass.getDeclaredFields()) {
int value = field.getInt(instance);
drawables.add(value);
}

它已经完成了所需的所有代码,现在可以正常使用列表中的整数,就像使用R.drawable.icon一样。但是,请注意,getDeclaredConstructors()newInstance()getDeclaredFields()getInt()都抛出了需要捕获的异常。

完整代码段(Java(:

public static List<Integer> getDrawablesList() throws IllegalAccessException, InvocationTargetException, InstantiationException {
Class<R.drawable> drawableClass = R.drawable.class;
R.drawable instance = (R.drawable) drawableClass.getDeclaredConstructors()[0].newInstance();
List<Integer> drawables = new ArrayList<>();
for (Field field :
drawableClass.getDeclaredFields()) {
int value = field.getInt(instance);
drawables.add(value);
}
return drawables;
}

完整代码段(Kotlin(:

(需要"org.jetbrains.kotlin:kotlin-reflect:YOUR_kotlin_VERSION"依赖项(

private fun getDrawablesList() : List<Int> {
val drawableClass = R.drawable::class
val instance = drawableClass.constructors.first().call()
val drawablesList = mutableListOf<Int>()
for (field in instance.javaClass.declaredFields) {
val test = field.getInt(instance)
drawablesList.add(test)
}
return drawablesList
}

最新更新