如果我知道图像的名称,如何获取图像的资源 ID? [复制]

Posted

技术标签:

【中文标题】如果我知道图像的名称,如何获取图像的资源 ID? [复制]【英文标题】:How do I get the resource id of an image if I know its name? [duplicate] 【发布时间】:2011-03-03 20:18:29 【问题描述】:

如果我知道图片的名称(在 android 中),如何获取图片的资源 ID?

【问题讨论】:

如果您想使用 kotlin,请参阅:***.com/a/52568692/1631967 【参考方案1】:

这样的:

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

【讨论】:

谢谢,这帮助我找到了解决类似问题的方法!我将使用getResources().getIdentifier(name, "id", getPackageName()); 来获取 ImageButton 的 ID(就像使用 R.id.name 一样)。 请注意,可绘制名称不应包含“.png”之类的扩展名 变量 name 中到底有什么?我想找到一个我知道其引用的按钮的 ID,在我的例子中是 button1 getResource()getPackageName() 显示错误。 cannot resolve method @Srujan Barai、getResource()getPackageName() 是来自 Activity 的方法。【参考方案2】:

你也可以试试这个:

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

链接: Dynamically Retrieving Resources in Android

【讨论】:

这可能会更快,但我发现如果你使用 proguard,它会给你带来麻烦。至少对我来说,这在 proguard 中不起作用 捕获通用异常是一个特别糟糕的主意。此外,请注意,如果没有对可绘制对象的硬引用,Proguard 可能会优化引用,因为它不相信它会在任何地方使用。 我现在明白了 :) 你的意思是在优化过程中 drawableName 发生变化并且无法使用这种方法找到资源,如果我是对的? :) @VSB:如果您的最后一条评论是对上面 Paul Lammertsma 评论的回应:不,他的意思是 Proguard 不知道这是对资源的引用,因此可能会删除该资源,相信它没有被使用。 一旦你使用了xxxxhdpi、xxhdpi等,这个方法就变得没那么有用了【参考方案3】:

公共系统资源示例:

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

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

【讨论】:

@Milaaaad 你是什么意思? 这意味着我对代码中的资源感到困惑,我在非活动类中使用它 @Milaaaad 此方法适用于系统资源。它们不依赖于上下文。【参考方案4】:

您可以使用此函数获取资源 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资源ID,你可以这样调用方法:

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

(或来自片段):

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

对于 String 资源 ID,您可以这样称呼它:

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

等等……

小心:如果找不到资源 ID,则会抛出 RuntimeException。确保在生产中正确恢复。

Read this

【讨论】:

我认为您需要从中删除static,否则getResources() 将不起作用。 @Richard Le Mesurier,你能解释一下原因吗?谢谢。 @Leo.Han 在我发表评论时,Context 不可用。修复方法是删除static 并将其移动到Context(例如ActivityApplication);或者替代修复是乔纳森在他的编辑中所做的,即将Context 传递给方法。 @Richard Le Mesurier,我刚才查看了编辑历史,和你说的一样,谢谢你时隔多年的友好回复:)【参考方案5】:

我遇到的另一种情况。

字符串图像名称 =“你好” 然后当它被传递到 getIdentifier 函数作为第一个参数,它将以字符串 null 终止传递名称,并且始终返回零。 通过这个 imageName.substring(0, imageName.length()-1)

【讨论】:

以上是关于如果我知道图像的名称,如何获取图像的资源 ID? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如果我知道使用 Powershell 的资源组名称,如何获取订阅名称

如何在首选项中存储图像资源/名称

如何通过子类化 UIButton 来获取按钮的背景图像名称?

如何从 listVIew 获取图像 id

getIdentifier()继续返回0

我在自定义表格视图中有 FB 朋友的图像和名称。如何获取 FB ID 中的选定行并将请求发送给多个朋友?