如果我知道它的名字,我如何获取图像的资源ID?

问题描述:

如果我知道它的名称(在Android中),如何获取图像的资源ID?如果我知道它的名字,我如何获取图像的资源ID?

像这样的东西:

String mDrawableName = "myappicon"; 
int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName()); 
+10

谢谢,这帮助我找到一个解决方案,以解决simliar问题!我将使用getResources()。getIdentifier(name,“id”,getPackageName());'获取ImageButton的ID(与使用R.id.name一样)。 – Select0r 2010-07-26 19:19:36

+38

请注意,可绘制名称不应包含像“.png”这样的扩展名 – larham1 2011-08-18 18:17:57

+9

此答案应标记为接受。 – 2012-07-24 11:59:06

你也可以试试这个:

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倍。我还发现它更方便和易于使用。希望它也能帮助你。

链接:Dynamically Retrieving Resources in Android

+1

这可能会更快,但是如果使用proguard,我发现它可能会让您陷入麻烦。至少对我而言,这在proguard中不起作用 – 2012-03-13 21:52:01

+0

这个getResources()。getIdentifier与proguard – 2012-03-13 21:52:30

+0

一起使用感谢您的通知:) – 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。一定要在生产中恢复正常。

用于公共系统资源

Read this

+4

我认为你需要从中删除'static',否则'getResources()'会不行。 – 2014-05-09 08:48:44

+0

@Richard Le Mesurier,你能解释一下为什么吗?谢谢。 – 2016-08-26 04:27:33

+1

@ 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"); 

alert

另一种方法是参考的文档android.R.drawable类。

+0

this是真的,但必须访问正确的上下文 – Milaaaad 2016-01-18 09:48:28

+1

@Milaaaad你是什么意思? – naXa 2016-01-18 10:08:57

+0

这意味着我被代码 中的资源困惑,我将它用于非活动类 – Milaaaad 2016-01-19 07:07:47

我遇到的另一种情况。

String imageName =“Hello” 然后当它传入 getIdentifier函数作为第一个参数时,它将传递带有字符串null终止的名称并始终返回零。 通过这个 imageName.substring(0,imageName.length() - 1)