在Android上批量获取多个位图资源

5
我有一系列的图像,例如icon1_0.png、icon1_1.png、icon1_2.png...以及icon12_0.png、icon12_1.png、icon12_2.png等等,我希望将它们与我的Android应用程序打包。理想情况下,我认为我应该能够将它们作为资源加载,但资源ID被设置为Java标识符。当然,Java标识符不能在运行时组装。我必须请求R.drawable.icon12_00,因此我无法设置循环。
for(int icon=0;icon<12;icon++)
 for(int frame=0;frame<3;frame++)
  //syntax error obviously
  BitmapFactory.decodeResource(getResources(), R.drawable."icon" + icon + "_" + frame + ".png");

有没有一种按名称获取资源的方法?更好的是,是否存在一种规范的方式在资源系统之外将数据文件打包到Android应用程序包中,以便我可以访问它们?

我在考虑反射,但这似乎不是正确的解决方案。

3个回答

13

使用Context(例如Activity)的getResources().getIdentifier()方法,但如果您需要多次使用它,请缓存结果。 getIdentifier()是在Resources中实现的。


好的,这个可以。getIdentifier("resname", "restype", "com.domain.appname"); 谢谢。 - Brian
1
不要将包名称作为静态值传递,可以使用 getPackageName() - Paresh Mayani

6

我知道你已经找到了一个答案,但是如果你使用反射,你会看到速度有很大的提升,因为getIdentifier()的速度较慢。我在这里写了如何使用反射方法的文章here。然而,这仅适用于访问自己的资源。


这怎么样?这快了一点。可惜的是,反射因其缓慢而出了名,所以getIdentifier肯定会非常慢。 - Brian

2

反射也非常慢,你应该只创建一个包含所有标识符的数组。


2
你的意思是,只需在代码中编写整个循环吗?还是有更聪明的方法?我对后者很感兴趣,因为如果我能比使用反射更快地获取资源,那将是一个不错的速度提升(但这将在稍微不同的情况下,其中应用程序数据指的是资源 - 而不是代码)。 - Dan Lew
@DanielLew 他的意思是说你有一个代码生成器,可以为你编写整个循环的代码。 - Pacerier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接