由于宽度和高度而未找到Android资源
问题描述:
我最近在商店中发布了一款Android应用,该应用几乎适用于所有用户。然而,我很快开始得到一些崩溃一周报告有以下跟踪:由于宽度和高度而未找到Android资源
Caused by: android.content.res.Resources$NotFoundException: File res/drawable-xhdpi/dark_button_unpressed.png from drawable resource ID #0x7f02005d
at android.content.res.Resources.loadDrawable(Resources.java:1716)
at android.content.res.Resources.getDrawable(Resources.java:581)
at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:162)
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:787)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:728)
at android.content.res.Resources.loadDrawable(Resources.java:1696)
... 40 more
Caused by: java.lang.IllegalArgumentException: width and height must be > 0
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:477)
at android.graphics.Bitmap.createBitmap(Bitmap.java:444)
at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349)
at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:498)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:473)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
at android.content.res.Resources.loadDrawable(Resources.java:1711)
... 45 more
这是不容易确定究竟是怎么回事。我可以从用户报告中收集的唯一信息是,它似乎主要发生在具有低密度显示器的设备上。此特定资源用作XML UI中视图的背景。
答
这里的问题是由Android中的可绘制资源的自动缩放和非常小的drawables的不幸组合引起的。
例如,如果您的应用只提供drawable-xhpdi
资源,则需要缩小尺寸以适合较低密度的屏幕。如果你自己没有提供这些资源,这是由Android自动完成的。
显示密度的规模被设置为这样的:
- xhdpi: 2.0
- HDPI: 1.5
- MDPI: 1.0
- LDPI: 0.75
这意味着您的xhdpi
资源在中等密度显示屏上按比例缩小2.0倍。这对质量可能是有害的,这就是为什么通常建议您自己创建并提供这些较低密度资源的原因。
现在回到手头的问题。拥有非常小的宽度或高度(1或2像素)的资源并不罕见。用例的一个例子是为视图提供纯色背景。
不幸的是,当提供这些资源为xhdpi
并缩小它们时,像素大小可能被截断为0.没有适当的防范措施,Android将无法创建具有该维度和崩溃的Bitmap。
有几种方案来解决这个:
- 包括资源作为
ldpi
并将它扩大相反,这并不影响目的作为背景。 - 包含资源作为
nodpi
可绘制,它永远不会被缩放。 - 改为使用XML资源。
最后一个选项最准确地描述了意图,并允许您轻松地改变颜色以后没有图像编辑程序:
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#AARRGGBB" />
</shape>
包括在drawables
文件夹这个资源,它将始终正常工作。
非常感谢你的出色答案! – 2013-10-18 21:59:39
@EladNava很高兴我可以帮助某人:) – Overv 2013-10-18 22:36:41
很好的解决方案和很好的解释:D这个问题花费我太多时间:D和其他人,谁遇到这个问题,我建议把所有9补丁图像(通常低图像)进入drawables文件夹作为Overv建议:) – hqt 2014-01-10 20:42:55