由于宽度和高度而未找到Android资源

由于宽度和高度而未找到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文件夹这个资源,它将始终正常工作。

+0

非常感谢你的出色答案! – 2013-10-18 21:59:39

+0

@EladNava很高兴我可以帮助某人:) – Overv 2013-10-18 22:36:41

+0

很好的解决方案和很好的解释:D这个问题花费我太多时间:D和其他人,谁遇到这个问题,我建议把所有9补丁图像(通常低图像)进入drawables文件夹作为Overv建议:) – hqt 2014-01-10 20:42:55