资源NotFoundException?

时间:2012-02-27 16:27:59

标签: android

我从Android市场获得崩溃报告:

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;

我做了一个干净的项目构建,然后直接做了我的发布版本(之间没有代码修改来给自动eclipse构建东西可能让R文件出错)

由于

10 个答案:

答案 0 :(得分:46)

I got this exception:

Resources$NotFoundException: String resource ID

when I was using setText with an int value. I had to convert it to String.

Before:

myTextView.setText(obj.SomeIntProperty);    

After:

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

答案 1 :(得分:10)

崩溃报告是否来自版本< = 1.6,并且您只在合格的文件夹中拥有某些资源,即"drawable-mdpi"而不仅仅是"drawable"?如果是这样,那么请阅读"已知问题"在this page的底部。

答案 2 :(得分:2)

我今天早上在申请中发现了同样的问题,并找到了一个非常简单的解决方案。问题看起来大而复杂,但事实并非如此。

我遵循的步骤是

  1. 自行删除bin文件夹
  2. 清理项目
  3. 从您的设备中删除应用程序
  4. 运行应用程序并检查您的方案。
  5. 据我所知,它不应再给出这个例外。

    原因:构建应用程序时,R.java包含所有内存地址,并且发生这些地址对于下次运行无效。

    第二个原因:当你拥有支持lanscape和portrati模式的应用程序时,如果你还没有为其中任何一个编写XML文件,那么可能会导致这种崩溃。当你必须支持这两种模式时,很有可能出现OutoFmemory和Memory泄漏问题。请考虑一下。

答案 3 :(得分:2)

这种情况多次出现,特别是在低密度手机上。我也注意到它主要发生在9个补丁图像上。

我的解决方案是在尽可能多的密度资源文件夹中包含9个补丁图像(mdpi,ldpi,hdpi,xdpi)。

答案 4 :(得分:1)

嘿,不知道,我实际上是在研究类似的问题,但可能就是这样。值得一提的是,虽然设备可以升级资源和布局,但它无法缩减它们。因此,如果您有最小值,请在AndroidManifest.xml中设置它们。尝试首先添加layout-ldpi和layout-small。

用于记录加载布局的有用技术是将android:tag附加到布局XML文件的每个根容器,并在设置onCreate()后在setContentView(R.id.layout)中仅打印值标签。它会告诉你哪些已经加载 - 如果仅用于调试目的,你仍然需要通过添加所有可能的组合来插入漏洞。

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

一旦弄清楚它是布局还是可绘制,其他指标将帮助您找到根本原因。现在,首先使用“always use”drawables检查布局。

星期一,当我回到办公室时,我会向您发布用于衡量此线程中捕获的数据的指标代码 - Which part of Android is in charge of picking a correct resource profile?

答案 5 :(得分:1)

您已包含某些引用Android SDK内容的代码。

例如,我一旦遇到类似的问题,当我删除该行

android:background="?android:attr/actionBarItemBackground"

从我的xml中,一切正常。

答案 6 :(得分:0)

如果您引用的资源(让我们称之为ResA)反过来引用缺少的资源(让我们称之为ResB),也会发生这种情况。 Android会为ResA引发ResourceNotFoundException,即使真正缺少的是ResB。这就是生活!

就我而言,ResB是在值-swxxxdp中定义的,而不是在值中定义的。因此,我在手机上获得此例外,但在平板电脑上却没有。

答案 7 :(得分:0)

在我的情况下,我有一个导致崩溃的布局文件:

我收到了以下日志 -

enter image description here

这显示了我实际代码的链接:

enter image description here

这行代码是什么:

enter image description here

我按照最受欢迎的答案的建议检查了我的文件导航器文件夹名称,看起来似乎缺少的资源位于正常layout文件夹

enter image description here

但是当查看Project文件导航器而不是Android文件导航器时,我能够看到不仅缺少正常layout文件夹中缺少的资源文件,但是我没有一个没有特殊扩展名的layout文件夹。

enter image description here

将Android资源目录添加到res文件夹并将其调用layout,然后将专业文件夹(例如layout-sw720dp)中的资源粘贴到其中,修复了我的问题

enter image description here

此解决方案也适用于建议的其他文件夹,例如drawable中没有文件,只有drawable-xxhdpi中的文件可以通过将文件移动到drawable并调整它来修复它如所须。好运文件夹恶魔!

答案 8 :(得分:0)

  1. 转到项目>清洁...
  2. 选择您的项目,然后按"确定"。
  3. 重新启动应用。

答案 9 :(得分:0)

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