从 Resources 对象中检索所有 Drawable 资源
在我的 Android 项目中,我想循环遍历整个 Drawable
资源集合。通常,您只能使用以下内容通过其 ID 检索特定资源:
InputStream is = Resources.getSystem().openRawResource(resourceId)
但是,我想获取所有我不会事先知道其 ID 的 Drawable
资源。是否有一个我可以循环遍历的集合,或者是否有一种方法可以获取项目中给定资源的资源 ID 列表?
或者,我在 Java 中是否有一种方法可以从 R.drawable 静态类中提取所有属性值?
In my Android project, I want to loop through the entire collection of Drawable
resources. Normally, you can only retrieve a specific resource via its ID using something like:
InputStream is = Resources.getSystem().openRawResource(resourceId)
However, I want to get all Drawable
resources where I won't know their ID's beforehand. Is there a collection I can loop through or perhaps a way to get the list of resource ID's given the resources in my project?
Or, is there a way for me in Java to extract all property values from the R.drawable
static class?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(12)
好吧,这感觉有点 hack,但这是我通过 Reflection 想到的。 (请注意,resources 是 android.content.res.Resources 类的实例。)
如果有人有更好的解决方案可以更好地利用 Android 调用,我可能不知道的,我绝对想见见他们!
Okay, this feels a bit hack-ish, but this is what I came up with via Reflection. (Note that
resources
is an instance of classandroid.content.res.Resources
.)If anyone has a better solution that makes better use of Android calls I might not be aware of, I'd definitely like to see them!
我采用了马特·哈金斯(Matt Huggins)的精彩答案,并对其进行了重构,使其更加通用:
用法:
I have taken Matt Huggins great answer and refactored it to make it more generic:
Usage:
我使用 getResources().getIdentifier 扫描资源文件夹中按顺序命名的图像。为了安全起见,我决定在第一次创建 Activity 时缓存图像 ID:
i used getResources().getIdentifier to scan through sequentially named images in my resource folders. to be on a safe side, I decided to cache image ids when activity is created first time:
您应该使用 Raw 文件夹和 AssetManager,但如果您想使用可绘制对象,因为为什么不呢,方法如下...
假设我们有一个很长的 JPG 可绘制对象文件列表,并且我们希望轻松获取所有资源 id逐一检索(R.drawable.pic1、R.drawable.pic2,...等)
You should use the Raw folder and AssetManager, but if you want to use drawables because why not, here is how...
Let's suppose we have a very long file list of JPG drawables and we want to get all the resource ids without the pain of retrieving one by one (R.drawable.pic1, R.drawable.pic2, ... etc)
添加一张名为 aaaa 的图片和另一张名为 zzzz 的图片,然后迭代以下内容:
这对我有用。
Add a picture named aaaa and another named zzzz, then iterate through the following:
This worked for me.
如果您发现自己想要这样做,您可能正在滥用资源系统。查看资产和
AssetManager
如果您想迭代 .apk 中包含的文件。If you find yourself wanting to do this you're probably misusing the resource system. Take a look at assets and
AssetManager
if you want to iterate over files included in your .apk.我想反射代码会起作用,但我不明白为什么你需要这个。
一旦安装了应用程序,Android 中的资源就是静态的,因此您可以拥有资源列表或数组。类似于:
从您的
Activity
中,您可以通过执行以下操作来获取它:I guess the reflection code will work but I don't understand why you need this.
Resources in Android are static once the application is installed so you can have a list of resources or an array. Something like:
And from your
Activity
you can get it by doing:只需这样做:
Just do this:
OP 想要绘图,而我需要布局。这就是我想出的布局。
name.startsWith
业务让我忽略系统生成的布局,因此您可能需要稍微调整一下。通过修改 clz 的值,这应该适用于任何资源类型。The OP wanted drawables and I needed layouts. This is what I came up with for layouts. The
name.startsWith
business lets me ignore system generated layouts, so you may need to tweak that a bit. This should work for any resource type by modifying the value ofclz
.可能的 Kotlin + Jetpack Compose 解决方案如下所示。请注意,这也仅过滤包含名称“icon”的可绘制对象,但也可以忽略过滤器:
然后可以使用其资源名称和 DP 大小绘制所有图标,如下所示:
A possible Kotlin + Jetpack Compose solution would look like this. Note that this one also filters only the drawable that contain the name "icon" but one can also just leave away the filter:
One can then draw all icons with their resource names and DP sizes like this:
使用我的代码
USE THIS MY CODE
要在 Kotlin 中创建可绘制数组:
To create an array of drawables in Kotlin: