安卓 - getIdentifier总是返回0(库+应用程序)

18

我有一个Android项目(com.appocaliptic.quizknife.app),它使用了Android库(com.appocaliptic.quizknife.core)。

我尝试获取库中的图片资源id。该图片的路径为:res/drawable-xhdpi/fr_200_133.png

然而,使用getIdentifier方法的所有尝试都返回0。问题出在哪里?

resId = getResources().getIdentifier("fr_200_133", "drawable", "com.appocaliptic.quizknife.core");
resId = getResources().getIdentifier("com.appocaliptic.quizknife.core:drawable/"+"fr_200_133", null, null);
resId = getResources().getIdentifier("drawable/fr_200_133", null, "com.appocaliptic.quizknife.core");

编辑:

啊,而且在 R.java 中有 drawable 和对应的属性。


你正在测试的系统是否具有xhdpi分辨率的屏幕? - Squonk
1
@Squonk - 当涉及到检索id本身时,这不应该成为问题;只有在检索与id相关联的可绘制对象时才会出现问题。此外,对于可绘制资源,系统将找到最佳匹配,因此即使在ldpi设备上,它也会使用xhdpi资源(经过缩放)。 - Ted Hopp
@TedHopp:是的,同意 - 我忘记了可绘制资源的最佳匹配。 - Squonk
6个回答

40
我遇到了同样的问题:"getIdentifier result 0",我通过将图像扩展名(*.jpg、*.jpeg等)删除以使其与R.java文件中的名称匹配来解决它。

33

你不应该使用库包名。尝试使用以下内容:

resId = getResources().getIdentifier("fr_200_133", "drawable", getPackageName());

(如果在视图中执行,则为 getContext().getPackageName())。

关键是您需要使用应用程序的包名(在清单中列出),而不是库的包名(在创建应用程序时实际上会消失)。


哇,它可以工作 O_o。非常感谢 - 顺便问一下 - 这个信息的来源是什么?我找到的所有资源都建议使用String包名。谢谢。 - bluszcz
2
@bluszcz - 我想我是从某个例子中学到了这个习语。关键是你需要使用应用程序的包名(在清单中列出),而不是库的包名(在创建应用程序时实际上会消失)。 - Ted Hopp
我认为你应该在回复中发布你的评论 - 这是非常关键的信息 ;) - bluszcz
这是最佳解决方案的原因是因为您没有使用硬编码值! - Daniel Viglione

12

我也遇到了同样的错误,唯一起作用的方法是换一种方式来解决:

resourceId = R.drawable.class.getField("fr_200_133").getInt(null);

这是反射,不推荐使用。 - Malwinder Singh
2
@MalwinderSingh 你能解释一下为什么吗? - Joshua Pinter

9

我曾遇到过类似的问题。我解决的方法与Hussam Otri提到的类似。例如:

//This doesn't work
context.getResources().getIdentifier("audio_1.mp3", "raw", this.getPackageName()); 

//This works (strip off the file extension)
context.getResources().getIdentifier("audio_1", "raw", this.getPackageName());

对我来说,那个扩展程序就是问题所在!谢谢! - user2342558

0
图像的名称是下划线(underscore)或“_”,我结果没问题,因为编译器将照片的名称重命名为示例:源:“img0001”编译后为“imag_0001”。

0
在我的情况下,语言是土耳其语,并且它用字母“ı”替换了所有资源文件中的字母“i”。我将字符串资源名称中的“ı”替换为“i”。现在我的应用程序运行良好。 代码:
public static int getResId(String imageName ,Activity activity) {
        int resourceId = activity.getResources().getIdentifier(imageName, "drawable", activity.getPackageName());
        if (resourceId == 0) {
            imageName = imageName.replace("ı", "i");
            resourceId = activity.getResources().getIdentifier(imageName, "drawable", activity.getPackageName());
        }
        return resourceId;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接