【问题标题】:Resources NotFoundException?资源 NotFoundException?
【发布时间】:2012-02-27 16:27:58
【问题描述】:

我收到来自 android 市场的崩溃报告:

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

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

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

该资源肯定存在于我的 /drawable 文件夹中。我有几十万次安装,我不确定这对某些用户来说是如何失败的,但对绝大多数用户来说都是如此。我想知道发生了什么,因为他们无法在这种状态下使用该应用程序。有什么想法吗?

谢谢

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

我还可以在我的 R.java 文件中看到相关可绘制对象的条目,如下所示:

public static final int foo=0x7f020034;

我对项目进行了干净的构建,然后直接进行发布构建(中间没有代码修改以提供自动 eclipse 构建的东西可能会让 R 文件出错)

谢谢

【问题讨论】:

  • 这很明显,但是您是否选择了 Eclipse 中的“自动构建”检查?如果不使用Eclipse,修改资源类后是否重新生成?你能告诉我们你的 R 课吗?
  • 嗨,是的,我确实检查了“自动构建”,但我确保在每次发布之前都进行干净的构建。我可以在 R.java 中看到该可绘制对象的资源条目(粘贴在上面)谢谢
  • 我没有看到任何粘贴的内容,但是如果您说条目在那里... R 中显示的包是否正确(与您的 Activity 相同)?
  • 嘿,同一个包。如果包错误或 R 文件中缺少条目,我认为所有其他安装也会崩溃。发生在少数用户身上,不明白为什么,很沮丧!
  • 我现在每周大约有 80 个。我不明白为什么!这是由我的所有和任何活动的负载引起的,而不仅仅是一个特定的资源。显然,我们在发布前进行了全面的回归测试,从未发现过这个问题。它可能来自哪里?这是android中的错误吗?在所有类型的设备和支持的操作系统 (2.2+) 上都可以看到它。

标签: android


【解决方案1】:

我遇到了这个异常:

Resources$NotFoundException: String resource ID

当我使用带有 int 值的 setText 时。我不得不把它转换成字符串。

之前:

myTextView.setText(obj.SomeIntProperty);    

之后:

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

【讨论】:

  • 我已经尝试解决这个问题好几个小时了。当我尝试执行 textView.setText(array.length) 时,我遇到了这个异常。 textView.setText(""+array.length) 是解决办法
  • fiuuuuu,你帮我省了几个小时的头疼
【解决方案2】:

崩溃报告是否来自版本 "drawable-mdpi" 而不仅仅是 "drawable"?如果是这样,请阅读 this page 底部的“已知问题”。

【讨论】:

  • 啊,当我在 /drawable-mdpi 中有一些资源,而在 /drawable 中有一些资源。我已经在 1.6 模拟器上运行了一段时间,但从来没有遇到过任何问题(我的最低目标是 1.6,所以用户甚至不应该能够在 1.5 上运行)。会是这样吗?那么它不应该在模拟器上崩溃吗?
  • 是的,它也应该在模拟器上崩溃。我自己使用 1.6 模拟器来追踪这些错误。如果你用模拟器仔细测试过,那么你可以排除这个bug:/
  • 嗯,是的,实际上我现在看到市场说这个错误发生在 Nexus One、Droid 和其他设备上。我认为 Nexus One 运行最低 2.0,与 Droid 相同。啊。
  • 这听起来最接近“家”IMO。
【解决方案3】:

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

我遵循的步骤是

  1. 自行删除 bin 文件夹
  2. 清理项目
  3. 从您的设备中删除应用程序
  4. 运行应用程序并检查您的场景。

据我所知,它不应该再给出这个例外。

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

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

【讨论】:

  • 无论如何对我来说 - 这没有用。我从应用商店的实时项目中获得这些崩溃报告。在测试期间或我自己使用各种设备(与发送给它的某些报告相同的设备/操作系统)使用实时版本时,我从未见过这种情况。这似乎与一个特定的资源/地址无关——对我来说——因为我在获取各种资源时看到了崩溃报告——这可能是由操作系统引发 OutOfMemory 异常引起的吗?如果是这样,我不会让 OOM 崩溃/堆栈跟踪。
  • 所以你是说 - 这可能是因为我正在加载一个布局,如 main.... 除了这个布局不包含在标准布局文件夹中,而是包含在布局中 - normal-port、layout-large-port 和 layout-xlarge-port & land(我已经设置了方向,所以它必须适合其中之一) - 可能是因为设备无法弄清楚自己的配置并尝试采用布局文件夹中的资源? 0- 有趣的是,我看到一些关于我测试过的设备的报告。
  • 是的。如果应用程序在方向更改时尝试从相应文件夹加载 XML,但有时如果 xml 没有放置,则会出现这种异常
  • 嗯,干杯,我不这样做,希望它能解决它。我从未在我的设备上看到过这个问题!
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

    例如,我曾经遇到过类似的问题,当我删除该行时

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

    从我的 xml 中,一切正常。

    【讨论】:

      【解决方案6】:

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

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

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

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

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

      【讨论】:

        【解决方案7】:

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

        在我的例子中,ResB 是在 values-swxxxdp 中定义的,但不是在 values 中定义的。因此,我在手机上遇到了这个异常,但在平板电脑上却没有。

        【讨论】:

          【解决方案8】:

          就我而言,我有一个导致崩溃的布局文件:

          我得到了以下日志-

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

          这行代码是什么:

          我按照最流行的答案的建议检查了我的文件导航器文件夹名称,看起来应该缺少的资源位于普通的 layout 文件夹中

          但是当查看Project 文件导航器而不是Android 文件导航器时,我能够看到不仅应该丢失的资源文件不在正常的layout 文件夹中,而且我什至没有有一个没有特殊扩展名的 layout 文件夹。

          将 Android 资源目录添加到 res 文件夹并将其命名为 layout,然后将您的专业文件夹(例如 layout-sw720dp)中的资源粘贴到其中解决了我的问题。

          此解决方案也适用于建议的其他文件夹,例如在 drawable 中没有文件并且只有在 drawable-xxhdpi 中的文件可以通过将文件移动到 drawable 并根据需要进行调整来修复。祝文件夹恶魔好运!

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-02-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多