首先你应该对R类有点了解:Read more here
简而言之:R 类是一个动态生成的类,其中包含内部类(例如 drawable 类)。这些内部类包含多个Integer常量,它们链接到对应的资源
这意味着,由于这里的可绘制对象被定义为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
}