0

我创建了一个带有图像的应用程序,并通过Android Icon Set向导添加了它们。该向导为图像创建了 3 个版本 - mdpi、hdpi、xhdpi。

我在 google play 上发布了我的应用程序,并且收到了来自具有 ldpi 屏幕的用户的崩溃报告。例外是Caused by: android.content.res.Resources$NotFoundException: File from drawable resource ID #0x7f02007f。drawable 存在于 mdpi、hdpi 和 xhdpi 中,并且该应用程序适用于其他用户。

所以我想问题在于它的 ldpi 版本中不存在可绘制剂量。

所以我的问题是:
1) 有没有办法让应用程序自动缩放 mdpi 可绘制对象而不是崩溃?
2) 为了支持 ldpi 屏幕,我必须将图像编辑为 ldpi 大小吗?

谢谢。

4

2 回答 2

1

这是不同密度管理的常见错误,因此这些是您问题的答案。

1.- 不,以您的资产存储方式,但是是的,“仅当您的资产位于当前密度的较低层次结构中时”例如:如果您有可绘制的资产(默认非特定密度)和可绘制的 ldpi 和您在中等密度设备中运行应用程序,操作系统将尝试将您的图像大小从 -ldpi 调整为您的密度(如果在图像中使用 dps 但会消耗内存)。操作系统处理资产的方式如下:

假设你有:

res-
    -drawable
        -icon.png
    -drawable-ldpi
        -icon.png
    -drawable-mdpi
       -icon.png

如果您在 HIGH Density 设备中运行应用程序,操作系统首先会尝试在 drawable-hdpi 中找到您的资产,但由于它不存在,它将开始向下层级结构直到找到它,所以在这种情况下它将在drawable-hdpi中找不到它,但会在drawable-mdpi中找到它并使用它来填充,一切都会好起来的,但会在内存中消耗资产中的密度差异。

现在,当操作系统进入资产文件夹层次结构并一直到最后并且没有找到任何东西时,您就会出现确切的错误,例如:

假设你有:

res-
    -drawable-hdpi
        -icon.png

如果你运行这个应用程序,在 HIGH Desnity Device 中它会完美运行,因为会在第一次尝试中找到资产并且永远不会沿着层次结构向下移动,对于 Extra High Density Device 也是如此,因为如果它在 drawable-xhdpi 中找不到它将在下一步中找到它,当沿着层次结构向下到 drawable-hdpi 并且工作得很好,但是对于 MEDIUM Density,首先它会尝试在 drawable-mdpi 中找到它,因为它不存在,将向下尝试在drawable-ldpi中找到它也没有运气,所以它会转到“默认(可绘制)”,这是一个很好的做法,包含平均大小的所有资产,至少使应用程序看起来模糊而不是崩溃,因为操作系统也找不到资产 BOOOM 没有找到资源,你有你的例外,这个机制适用于 Android 中的几乎所有资源

2.- 是的,您必须在 ldpi 中创建资产并将它们存储在 drawable-ldpi 或 drawable(默认 - 无密度)中,以使其看起来不错。

所有这些信息都来自一本书,如果您仍有疑问,请在 Eclipse 中创建一个空的 Android 项目,并注意 SDK 如何在每个密度中创建一个具有特定大小的 icon_launcher.png img 来准确处理此问题。根据我的经验,我发现始终处理所有密度很有用,但更重要的是让我的所有资产在默认文件夹中具有平均密度/质量,以避免这个确切的问题,以防你忘记一个密度发展,与其说是崩溃,不如说是一种模糊的资产。

希望这可以帮助。

问候!

于 2013-10-19T15:34:16.680 回答
-1

有什么方法可以让应用程序自动缩放 mdpi 可绘制对象而不是崩溃?

这会自动发生,除非固件制造商(设备制造商或 ROM 修改器)搞砸了。

为了支持 ldpi 屏幕,我必须将图像编辑为 ldpi 大小吗?

不。

我会查找7f02007fR.java您的生产代码库相关的内容,并确保它是您认为的那样。请记住,这些数字会在每次编译时重新生成。也许这是一个根本没有这个数字的可绘制资源的情况,在任何密度下,因为R.java与实际的资源打包不同步。为避免此问题,请在制作生产 APK 的过程中进行干净构建(例如,Eclipse 内部的 Project > Clean)。

于 2013-10-19T13:45:30.843 回答