【问题标题】:Resources Not Found Exception only when running on specific devices仅在特定设备上运行时未找到资源异常
【发布时间】:2020-06-23 03:13:53
【问题描述】:

我在 Android Studio 模拟器和 Google PLay Pre-Launch 检查中遇到了崩溃,仅检查 oe 设备。

列出的资源肯定存在于我的源代码中 - 它位于 drawable 文件夹中,而不是任何特定的 dpi 文件夹中 - 在我尝试过我的应用程序的所有其他设备上都可以找到它,即模拟器设备,Pre-启动测试设备和几个物理设备。

Caused by: android.content.res.Resources$NotFoundException: File res/drawable/ic_amalfi_pro_link.xml from drawable resource ID #0x7f080071

我可以看到与失败的设备的主要区别在于它的分辨率较低 - 因此我检查矢量可绘制对象是否位于可绘制文件夹中,而不是特定的 dpi 文件夹中。

崩溃设备也是 API 19,而工作设备是更高版本。 (对于我尚未在 Pre Launch 测试中针对 API 21 进行全面调查的不同资源,我遇到了类似的崩溃)。

请注意,我在 build.gradle (app) 中启用了对矢量可绘制对象的旧版支持:

    vectorDrawables {
        useSupportLibrary true
    }

我已经尝试了一个干净的构建 - 没有变化。

我已尝试使缓存无效并重建 - 没有变化。

我已尝试将可绘制对象更改为其他内容,改回并重建 - 没有变化。

我确实在同一模拟器测试设备上使用不同的可绘制对象发生了相同的崩溃,并用不同的可绘制对象替换该可绘制对象避免了第一次崩溃并将我转移到导致崩溃的下一个可绘制对象,所以它似乎确实相关到特定的drawables - 但是drawable在那里并且可以在其他设备上工作。

这太令人沮丧了,我只是不知道在哪里寻找问题。

更新:

根据下面的内容,需要澄清相关矢量可绘制对象是否用于我测试的任何其他活动。

  • 如果我将失败的可绘制对象添加到我的主要活动中,它在我的主要活动中完美运行,但仍然无法在它导致崩溃的活动中找到并且仍然导致崩溃
  • 我的项目中似乎至少有三个矢量可绘制对象在三个不同的活动中表现相同
  • 如果我将崩溃活动中的有问题的可绘制对象替换为另一个矢量可绘制对象(不是导致崩溃的其他可绘制对象),则相关活动不会崩溃。
  • 如果我将三个崩溃活动中的有问题的可绘制对象替换为其他有问题的可绘制对象之一,则该活动会崩溃并报告找不到新的有问题的可绘制对象。

我已经检查了可绘制 XML,它与我在此项目中使用的其他不会导致崩溃的矢量可绘制对象相同(路径详细信息除外)。

【问题讨论】:

  • Dpi 不仅是一个可能的限定符,它必须至少存在于 res/drawable 中而没有任何限定符。您确定当前资源放在 res/drawable 中吗?另请注意,如果您在 xml 中定义了矢量,则 API 21 支持矢量可绘制对象。
  • 是的,在drawable 中没有任何限定符 - 所有可绘制对象都在此文件夹中。我还启用了旧版矢量可绘制支持 - 我的所有可绘制对象都是 XML 中的矢量,并且我的主要活动中的每个可绘制对象都工作正常。当我切换到包含此特定可绘制对象的活动时,我遇到了崩溃。
  • 您是否想说在 MainActivity 和其他人中使用的特定资源,在 MainActivity 中它工作正常,但在其他人中不起作用?您能否提供代码在何处以及如何使用此特定资源?
  • 抱歉不清楚。没有导致崩溃的drawable仅用于崩溃活动。但它适用于其他设备上的该活动。
  • 不过,这是一个很好的观点,它是一个不用于主要活动的可绘制对象 - 在那里进行调查。

标签: android android-studio android-drawable android-resources


【解决方案1】:

release 1.1.0-alpha01 of the AndroidX AppCompat library开始,复合矢量drawables有“compat”属性:

  • app:drawableTopCompat
  • app:drawableLeftCompat
  • app:drawableStartCompat

您必须使用AppCompatTextView 来利用这些属性。如果您的布局被从 AppCompat 主题构建的 LayoutInflater 膨胀,当您使用 <TextView> 标签时,这将自动发生。如果没有,您必须将它们明确指定为 <androidx.appcompat.widget.AppCompatTextView> 标记。

【讨论】:

  • 完美!尽管我找到了实现相同目标的另一种方法,但这是解决我遇到的问题的正确方法。 (我实际上会坚持使用LinearLayout 解决方法,因为在我的用例中它实际上简化了一些其他操作,但我会在未来记录这种正确的方法。
【解决方案2】:

我找到了问题的原因。

在复合可绘制对象中使用矢量可绘制对象的任何地方都会发生崩溃。

drawable 本身并没有什么问题,我只是将它们从复合 drawable 中移出并移到 LinearLayout 中的 ImageView 中以重新创建相同的效果。

一个效率较低的布局,但现在没有崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 2017-03-04
    相关资源
    最近更新 更多