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


Answers:


269

用这样的东西:

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

10
谢谢,这帮助我找到了类似问题的解决方案!我将getResources().getIdentifier(name, "id", getPackageName());用来获取ImageButton的ID(就像使用R.id.name一样)。
Select0r 2010年

42
请注意,绘制的名字不应该包括像“png格式”的延伸
larham1

1
变量到底是什么name?我想找到一个按钮的ID,在我的情况下,该按钮的引用是我知道的button1
John Watson 2012年

1
getResource()getPackageName()显示错误。cannot resolve method
Srujan Barai 2015年

@Srujan巴拉伊,getResource()并且getPackageName()是从活性的方法。
,贝尔加(Berga)

29

您也可以尝试以下操作:

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);
}

我已经从下面的URL复制了此源代码。根据此页面上进行的测试,它比getIdentifier()快5倍。我还发现它更方便易用。希望它也对您有帮助。

链接: 在Android中动态检索资源


2
这可能会更快,但是我发现如果您使用proguard可能会给您带来麻烦。这并不在proguard的至少为我工作
佩德罗Rainho

捕获通用异常是一个特别糟糕的主意。此外,请注意,如果没有对可绘制对象的硬引用,则Proguard可能会优化该引用,因为它不相信可在任何地方使用它。
Paul Lammertsma,2013年

我现在明白了:)您的意思是,在优化过程中drawableName更改,并且如果我是对的话,则无法使用此方法找到资源?:)
VSB

1
@VSB:如果您的最后评论是对Paul Lammertsma上面评论的回应:不,他的意思是Proguard不知道这是对资源的引用,因此可能会删除该资源,并认为该资源未被使用。
ToolmakerSteve 2015年

一旦您使用xxxxhdpi,xxhdpi等,此方法将不再有用
某处某人

11

公共系统资源的示例:

// this will get id for android.R.drawable.ic_dialog_alert
int id = Resources.getSystem().getIdentifier("ic_dialog_alert", "drawable", "android");

警报

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


1
@Milaaaad是什么意思?
naXa

这意味着我对代码中的资源感到困惑,并且在非活动类中使用它
Milaaaad

1
@Milaaaad此方法用于系统资源。它们不依赖于上下文。
naXa

10

您可以使用此功能获取资源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)
    } 
}


因此,如果您想获取Drawable Resource ID,可以调用以下方法:

getResourseId(MyActivity.this, "myIcon", "drawable", getPackageName());

(或来自片段):

getResourseId(getActivity(), "myIcon", "drawable", getActivity().getPackageName());


对于字符串资源ID,可以这样称呼它:

getResourseId(getActivity(), "myAppName", "string", getActivity().getPackageName());

等等...


注意:如果找不到资源ID,它将引发RuntimeException。确保在生产中正确恢复。

读这个


4
我认为您需要从中删除static,否则getResources()将无法正常工作。
理查德·勒·马修里尔

@Richard Le Mesurier,您能解释为什么吗?谢谢。
Veer

1
@ Leo.Han在我发表评论时,该评论Context不可用。解决方法是将其删除static并将其移动到Context(例如ActivityApplication)中;或替代修正是乔纳森(Jonathan)在其编辑中所做的,即将a传递Context给该方法。
理查德·勒·马修里尔

1
@Richard Le Mesurier,我刚刚检查了编辑历史记录,就像您所说的一样,感谢您这么多年后的亲切答复:)
Veer

0

我遇到的另一种情况。

字符串imageName =“ Hello”,然后将其作为第一个参数传递给getIdentifier函数时,它将传递以字符串null终止的名称,并且始终返回零。传递此imageName.substring(0,imageName.length()-1)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.