资源未找到异常?

40

我从安卓市场收到了崩溃报告:

android.content.res.Resources$NotFoundException: Resource ID #0x....

我每周收到大约17个这样的错误。 它指向我的代码中的以下内容:

context.getResources().getDrawable(R.drawable.foo);

那个资源在我的 /drawable 文件夹中肯定存在。我已经有几十万个安装了,不确定为什么这对一些用户失败了,但对绝大多数用户有效。我想找出发生了什么事情,因为他们无法在这种状态下使用该应用程序。有任何想法吗?

谢谢

--------- 更新 ----------------------

我也可以在我的 R.java 文件中看到相关的 drawable 条目,看起来像:

public static final int foo=0x7f020034;

我进行了一次代码的全量构建,然后紧接着进行了发布版本的构建(这之间没有做任何代码修改,以避免可能导致 R 文件出错的自动 Eclipse 构建工具)

谢谢


我现在每周收到大约80个反馈。我不知道为什么!这是由于我的所有活动的负载,而不仅仅是一个特定的资源。显然,在发布之前我们会进行全面的回归测试,并且从未遇到过这个问题。它可能来自哪里?这是Android中的一个错误吗?它在所有类型的设备和支持的操作系统(2.2+)上都有出现。 - Aiden Fry
我的应用程序也出现了这个问题。根据我的经验和用户的投诉,这个问题发生在QVGA设备上。我在QVGA模拟器上运行了我的应用程序,在设置启动画面布局的onCreate()方法中发生了相同的异常。 - Mohammad Imran
一些设备正在使用您没有提供的布局,而可绘制项/布局“丢失”...这是一个特定于设备的问题,在您拥有该设备并在其上进行调试之前,无法解决。 - Shark
@Shark 这听起来很有前途,但是这在我拥有的某些设备上被报告了。现在,这可能是因为我正在加载一个布局,例如main... 除了这个布局不包含在标准布局文件夹中,而是包含在layout-normal-port、layout-large-port和layout-xlarge-port & land中(我已经设置方向,使其适合其中之一)-是否因为设备无法找出自己的配置并尝试从布局文件夹中获取资源? - Aiden Fry
显示剩余5条评论
9个回答

52

我遇到了这个异常:

Resources$NotFoundException: String resource ID

当我使用setText方法传入一个整数值时,我必须将其转换为字符串。

之前:

myTextView.setText(obj.SomeIntProperty);    

之后:

myTextView.setText(String.valueOf(obj.SomeIntProperty));

我已经花了几个小时来解决这个问题。当我尝试使用textView.setText(array.length)时,我得到了一个异常。textView.setText(""+array.length)是解决方案。 - Yusuf Çağlar
fiuuuuu,你救了我数小时的头痛。 - Gianmarco

12

如果崩溃报告来自版本 <=1.6,且您仅在合格文件夹中拥有某些资源,例如"drawable-mdpi"而不是"drawable",那么请阅读底部的“已知问题” 此页面.


啊,糟糕了,我在/drawable-mdpi中有一些资源,在/drawable中有其他资源。虽然我已经在1.6模拟器上运行了一段时间,但从未遇到任何问题(我的最小目标是1.6,因此用户甚至不能在1.5上运行)。那可能是这个原因吗?难道它不应该在模拟器上崩溃吗? - user291701
是的,它也应该在模拟器上崩溃。我自己使用 1.6 模拟器来追踪此类错误。如果您仔细地使用模拟器进行了测试,那么您可以排除这个错误 :/ - pgsandstrom
嗯,实际上我现在看到市场在说这个错误发生在Nexus One,Droid,然后其他设备上。我想Nexus One运行的是至少2.0版本,Droid也一样。烦死了。 - user291701
在我看来,这听起来最接近“家”。 - Shark

2
你已经包含了一些引用来自 Android SDK 的代码。
例如,我曾经遇到过类似的问题,当我删除了这行代码时:
android:background="?android:attr/actionBarItemBackground"

从我的 XML 文件中,一切正常地工作。


2
我今天早上在我的应用程序中发现了同样的问题,并找到了一个非常简单的解决方法。虽然这个问题看起来很大且复杂,但其实并不是。
我遵循的步骤如下:
1. 删除 bin 文件夹本身。 2. 清理项目。 3. 从您的设备中删除应用程序。 4. 运行应用程序并检查您的场景。
按照我的理解,它不应再次出现此异常。
原因:当您构建应用程序时,R.java 包含所有内存地址,而这些地址可能对于下一次运行无效。
第二个原因:当您有支持横向和纵向模式的应用程序,如果您没有为其中任何一个编写 XML 文件,则可能会导致此类崩溃。当您需要支持两种模式时,很容易出现 OutoFmemory 和内存泄漏问题,请注意这一点。

1
对我来说,这并没有什么用。我从应用商店上的实际项目中收到了这些崩溃报告。在测试或我自己使用各种设备的实际版本时,我从未遇到过这种情况(而这些设备/操作系统与某些报告中所述的设备/操作系统相同)。这似乎与特定资源/地址无关 - 对我来说 - 因为我在获取各种资源时都看到了崩溃报告 - 这可能是由于操作系统抛出了OutOfMemory异常造成的吗?如果是这样的话,那么我没有收到OOM崩溃/堆栈跟踪信息。 - Aiden Fry
1
那么你是否是在说 - 这可能是因为我正在加载一个布局,例如main ...,但是这个布局没有包含在标准布局文件夹中,而是包含在layout-normal-port、layout-large-port和layout-xlarge-port&land中(我设置了方向,所以它必须适合其中之一)- 是否是因为设备无法确定自己的配置并尝试从布局文件夹中获取资源?另外,有趣的是我看到一些我已经测试过的设备上出现了一些报告。 - Aiden Fry
1
是的。如果应用程序在方向更改时尝试从相应文件夹加载XML,但有时如果未放置XML,则会出现此类异常。 - Dinesh Prajapati
嗯,谢谢,我会尝试这样做并希望解决问题。我从未在我的设备上遇到过这个问题! - Aiden Fry

2

这种情况已经发生过多次,特别是在像素密度较低的手机上。我还注意到这种情况主要发生在9-patch图像上。

我的解决方案是将9-patch图像包含在尽可能多的像素密度资源文件夹中(mdpi、ldpi、hdpi、xdpi)。


2
在我的情况下,我有一个导致崩溃的布局文件:
我得到了以下日志 -
这显示了我的实际代码的链接:
这是这行代码:
我按照最受欢迎的答案建议检查了我的文件导航器文件夹名称,看起来缺少的资源在普通layout文件夹中,但是当在Project文件导航器而不是Android文件导航器下查看时,我能够看到,不仅缺失的资源文件不在正常的layout文件夹中,而且我甚至没有一个没有特殊扩展名的layout文件夹。
通过将Android资源目录添加到res文件夹并将其命名为layout,然后将从您的专业文件夹(例如layout-sw720dp)复制的资源粘贴到其中,我解决了这个问题。这种解决方案也适用于其他文件夹,例如仅在drawable-xxhdpi中而不在drawable中拥有文件的情况,可以通过将文件移动到drawable中并根据需要进行微调来解决。祝你好运!

1

嘿,我也不知道,我正在处理一个类似的问题,但这可能是原因。值得一提的是,虽然设备可以升级资源和布局,但它无法降级它们。所以如果你有最小值,请在AndroidManifest.xml中设置它们。首先尝试添加layout-ldpi和layout-small。

记录哪个布局被加载的有用技巧是将android:tag附加到布局XML文件的每个根容器上,并在onCreate()中设置setContentView(R.id.layout)后仅打印标记的值。它会告诉你哪个被加载了 - 你仍然需要通过添加所有可能的组合来堵住洞口,即使只是为了调试目的。

另外,将你的可绘制对象重命名为drawables-nodpi文件夹,以确保没有可绘制对象丢失。这将关闭内部缩放,使APK更小,并且不从任何其他可绘制对象文件夹中“挑选”。

一旦你确定是布局还是可绘制对象,额外的指标将帮助你找到根本原因。现在,首先检查具有“始终使用”可绘制对象的布局。

周一回到办公室时,我会给您发布用于测量在此线程中捕获的数据的指标代码 - Android 的哪个部分负责选择正确的资源配置文件?


0
这种情况也可能发生在你所引用的资源(我们称之为ResA)反过来又引用了一个缺失的资源(我们称之为ResB)。即使真正缺失的是ResB,Android也会因为找不到ResA而抛出ResourceNotFoundException异常。这就是生活!
在我的情况下,ResB在values-swxxxdp中被定义,但在values中没有定义。因此我在手机上遇到了这个异常,但在平板电脑上却没有。

0

当未定义纵向XML布局文件时,可能会发生错误。这并不总是发生,但例如,如果用户快速关闭并打开手机,则会发生这种情况,我想在这种情况下,系统会在纵向方向上调用onCreate,然后再调用横向方向上的onCreate。


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