我创建了一个带图片的应用,我通过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 drawables而不是崩溃?
2)对于支持ldpi屏幕,我必须将图像编辑为ldpi尺寸吗?
感谢。
答案 0 :(得分: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设备中它将运行完美,因为将在第一次尝试中找到资产并且永远不会进入层次结构,超高密度设备的情况相同,因为如果它没有在drawable中找到它-xhdpi它会在下一步中找到它,当时将层次结构下放到drawable-hdpi并且工作正常,但是对于MEDIUM Density,然而,首先它会尝试在drawable-mdpi中找到它,因为它不在那里,会去下来并尝试在drawable-ldpi中找到它也没有运气,所以它将转到“默认(可绘制)”,这是一个很好的做法,包含平均大小的所有资产,至少使应用程序看起来比崩溃模糊,由于操作系统无法找到资产BOOOM没有找到资源,你有例外,这个机制几乎适用于Android中的任何资源
2.-是的,您必须在ldpi中创建资产并将它们存储在drawable-ldpi或drawable(默认 - 无密度)中,以使其看起来很好。
所有这些信息都是从一本书中取出的,如果您仍有疑问,请在Eclipse中创建一个空的Android项目,并注意SDK如何在每个密度中创建一个icon_launcher.png img,其具有特定大小以准确处理此问题。根据我的经验推荐,我发现有用的是始终处理所有密度,但更重要的是将我的所有资产在默认文件夹中具有平均密度/质量,以避免这个问题,以防您在忘记密码期间忘记一个密度发展,比崩溃更好的模糊资产。
希望这有助于。
问候!
答案 1 :(得分:-1)
有没有办法对应用程序说自动缩放mdpi drawables而不是崩溃?
这是自动发生的,除非固件制造商(设备制造商或ROM modder)搞砸了。
对于支持ldpi屏幕,我必须将图像编辑为ldpi尺寸吗?
没有
我会在与您的生产代码库关联的7f02007f
中查找R.java
,并确保它符合您的想法。请记住,每次编译都会重新生成这些数字。也许这种情况下,由于R.java
与实际资源包装不同步,因此该数字在任何密度下都没有可绘制的资源。要避免此问题,请在制作APK时进行干净的构建(例如,Project>清理Eclipse内部)。