Android 使用编程字符串设置图像资源可绘制

Android 使用编程字符串设置图像资源可绘制,android,resources,drawable,identifier,Android,Resources,Drawable,Identifier,使用带有基本适配器的数组填充listview。有过多的可选配抽屉,因此开关箱效率极低。我一直在尝试使用getResources().getIdentifier()系统实现一个两行程序,但所有尝试都未能返回0 x 0000的资源id 工作代码 try { final ImageView star = convertView.findViewById(R.id.star); final JSONObject ob

使用带有基本适配器的数组填充listview。有过多的可选配抽屉,因此开关箱效率极低。我一直在尝试使用getResources().getIdentifier()系统实现一个两行程序,但所有尝试都未能返回0 x 0000的资源id

工作代码

            try {
                final ImageView star = convertView.findViewById(R.id.star);
                final JSONObject object = list.getJSONObject(i);
                switch (object.getString("star")){
                    case "a":
                        star.setImageResource(R.drawable.stara);
                        break;
                    case "b":
                        star.setImageResource(R.drawable.starb);
                        break;
                    case "c":
                        star.setImageResource(R.drawable.starc);
                        break;
                    case "d":
                        star.setImageResource(R.drawable.stard);
                        break;
                }
我需要这样的东西,但是getIdentifier()方法

“star”+object.getString(“star”)+“.png”是资源文件夹(stara.png、starb.png等)中可绘制的确切名称

我一直使用getIdentifier()方法获取此异常


如何正确地实现这一点或更好地使用编程字符串来确定设置为imageview的资源可绘制名称?

您应该省略“.png”。如果您正在寻找“stara.png”,那么您试图获得的是idenfifier
R.drawable.stara
,因此您应该拥有

getActivity().getResources().getIdentifier("star" + object.getString("star"), "drawable", getActivity().getPackageName())));

删除
+“.png”
。您没有指定资源的扩展名。谢谢!将在9分钟内接受答案。有更有效的方法吗?如果您真的需要从
JSONObject
中的值(如“a”)映射到可绘制的值,那么除了使用开关和
getIdentifier
之外,我想不出任何其他选项。然而,我可以建议的是,不要直接处理
JSONObject
。使用
列表
创建一个
列表
,这应该是适配器所使用的。对于每个模型对象,您只需要执行一次从字符串到可绘制ID的转换(在构造函数中),然后您就可以使用类似于
public int getDrawableId()
的内容返回ID。这最终会更有效率。您也可以简单地使用静态映射从JSONObject提供的键解析可绘制的整数。
No package identifier when getting value for resource number 0x00000000
getActivity().getResources().getIdentifier("star" + object.getString("star"), "drawable", getActivity().getPackageName())));