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

man*_*anu 132 android android-image android-resources

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

Fra*_*ita 265

有这样的事情:

String mDrawableName = "myappicon";
int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());
Run Code Online (Sandbox Code Playgroud)

  • 请注意,drawable名称不应包含".png"之类的扩展名 (42认同)
  • 谢谢,这帮助我找到了一个解决simliar问题的方法!我将使用`getResources().getIdentifier(name,"id",getPackageName());`获取ImageButton的ID(就像使用R.id.name一样). (10认同)
  • 这个答案应该标记为已接受. (9认同)

VSB*_*VSB 28

你也可以试试这个:

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);
}
Run Code Online (Sandbox Code Playgroud)

我从下面的网址中复制了这些源代码.根据在此页面中完成的测试,它比getIdentifier()快5倍.我还发现它更方便易用.希望它也能帮到你.

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

  • 这可能会更快,但我发现如果您使用proguard可能会给您带来麻烦。至少对我而言,这在proguard中不起作用 (2认同)

Azh*_*har 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)
    } 
}
Run Code Online (Sandbox Code Playgroud)


因此,如果您想获得可绘制资源ID,可以像这样调用方法:

getResourseId(MyActivity.this, "myIcon", "drawable", getPackageName());
Run Code Online (Sandbox Code Playgroud)

(或从片段):

getResourseId(getActivity(), "myIcon", "drawable", getActivity().getPackageName());
Run Code Online (Sandbox Code Playgroud)


对于字符串资源ID,您可以这样调用它:

getResourseId(getActivity(), "myAppName", "string", getActivity().getPackageName());
Run Code Online (Sandbox Code Playgroud)

等等...


小心:如果找不到资源ID,它会抛出RuntimeException.务必在生产中正确恢复.

读这个

  • 我认为你需要从中删除`static`,否则`getResources()`将无效. (4认同)

naX*_*aXa 10

公共系统资源的示例:

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

警报

另一种方法是引用android.R.drawable类的文档.