如果我知道它的名字,我如何获取图像的资源ID?
像这样的东西:
String mDrawableName = "myappicon";
int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());
你也可以试试这个:
try {
Class res = R.drawable.class;
Field field = res.getField("drawableName");
int drawableId = field.getInt(null);
}
catch (Exception e) {
Log.e("MyTag", "Failure to get drawable id.", e);
}
我从以下网址复制本的源代码。基于本页面所做的测试,它比getIdentifier()快5倍。我还发现它更方便和易于使用。希望它也能帮助你。
这可能会更快,但是如果使用proguard,我发现它可能会让您陷入麻烦。至少对我而言,这在proguard中不起作用 – 2012-03-13 21:52:01
这个getResources()。getIdentifier与proguard – 2012-03-13 21:52:30
一起使用感谢您的通知:) – VSB 2013-06-28 13:51:29
您可以使用此功能来获取资源ID:如果你想获得一个可绘制资源ID
public static int getResourseId(Context context, String pVariableName, String pResourcename, String pPackageName) throws RuntimeException {
try {
return context.getResources().getIdentifier(pVariableName, pResourcename, pPackageName);
} catch (Exception e) {
throw new RuntimeException("Error getting Resource ID.", e)
}
}
所以,你可以这样调用方法:
getResourseId(MyActivity.this, "myIcon", "drawable", getPackageName());
(或片段):
getResourseId(getActivity(), "myIcon", "drawable", getActivity().getPackageName());
对于字符串资源ID,你可以这样调用:
getResourseId(getActivity(), "myAppName", "string", getActivity().getPackageName());
等等
小心:如果无法找到资源ID,则会引发RuntimeException。一定要在生产中恢复正常。
用于公共系统资源我认为你需要从中删除'static',否则'getResources()'会不行。 – 2014-05-09 08:48:44
@Richard Le Mesurier,你能解释一下为什么吗?谢谢。 – 2016-08-26 04:27:33
@ Leo.Han当我发表评论时,“Context”不可用。 Fix要么删除'static'并将其移入'Context'(例如'Activity'或'Application');或者替代修正是乔纳森在编辑中所做的,即将“上下文”传递给该方法。 – 2016-08-26 06:48:36
实施例:
// this will get id for android.R.drawable.ic_dialog_alert
int id = Resources.getSystem().getIdentifier("ic_dialog_alert", "drawable", "android");
另一种方法是参考的文档android.R.drawable类。
我遇到的另一种情况。
String imageName =“Hello” 然后当它传入 getIdentifier函数作为第一个参数时,它将传递带有字符串null终止的名称并始终返回零。 通过这个 imageName.substring(0,imageName.length() - 1)
谢谢,这帮助我找到一个解决方案,以解决simliar问题!我将使用getResources()。getIdentifier(name,“id”,getPackageName());'获取ImageButton的ID(与使用R.id.name一样)。 – Select0r 2010-07-26 19:19:36
请注意,可绘制名称不应包含像“.png”这样的扩展名 – larham1 2011-08-18 18:17:57
此答案应标记为接受。 – 2012-07-24 11:59:06