按字符串查找可绘制对象

54

可能有重复:
Android - 如何使用@drawable字符串打开资源

首先,对于标题我不太确定可以设置什么标题,抱歉。

好的,下面是我的问题:

我将从外部数据库接收一个字符串,例如:'picture0001'。

在 res/drawable 文件夹中,我有一张名为 picture0001 的图片。

我想将该图片设置为 ImageView 的背景(source)。

问题是,如何使用从外部数据库得到的字符串查找该图片。

非常感谢。

2个回答

192

是的,你可以使用Resources.getIdentifier()方法根据名称查找。

Context context = imageView.getContext();
int id = context.getResources().getIdentifier("picture0001", "drawable", context.getPackageName());
imageView.setImageResource(id);

虽然不够高效,但这种方法可以用来查找偶尔需要的资源。


@QuinDa 太好了!如果答案对您有帮助,请不要忘记点击旁边的复选框——这将有助于您在未来获得更好的答案!;) - Cat
@QuinDa 不是上箭头(需要15个声望),而是勾选标记。但看起来你已经找到了! :) - Cat
冲上投票榜! - Egemen Hamutçu
请注意,如果您使用它,Android Studio 将视其为未使用的资源,因此“重构/删除未使用的资源”选项将无法处理它。 - gturedi
1
我用以下代码解决了这个问题:drawable = resources.getDrawable(resources.obtainTypedArray(R.array.array_name).getResourceId(array_index, 0), context.getTheme()); - Dmitry
显示剩余2条评论

4
您也可以像这样使用反射:

您也可以像这样使用反射:

Class c = Class.forName("your.project.package.R");
Field f = c.getDeclaredField("drawable");
Class d = f.getDeclaringClass();
Field f2 = d.getDeclaredField("yourstring");
int resId = f2.getInt(null);
Drawable d = getResources().getDrawable(resId);

尽管如此,最佳解决方案是MarvinLabs所建议的。

5
وˆ‘认ن¸؛Resources.getIdentifierهڈ¯èƒ½و¯”è؟™ن¸ھو–¹و³•و›´ه®¹وک“م€‚ - Tim
是的,但这个解决方案更快(超过40%)。 - An-droid
@An-droid - 你能提供一些这方面的资源吗?我检查了一下,发现差异微不足道。我也读了那篇博客文章,但除了反射比查找快5倍的可疑说法外,没有其他指标。对我来说,结果似乎只取决于资源在R文件中的位置(越靠上,查找速度越快)。 - katzenhut
1
@An-droid - 我找到了这篇文章的链接,如果你想查看的话:http://daniel-codes.blogspot.de/2009/12/dynamically-retrieving-resources-in.html - katzenhut

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