7

我最近在商店中发布了一个 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 中视图的背景。

4

1 回答 1

22

这里的问题是由 Android 中可绘制资源的自动缩放和非常小的可绘制对象的不幸组合引起的。

例如,如果您的应用程序仅提供drawable-xhpdi资源,则需要缩小它们的大小以适应较低密度的屏幕。如果您自己不提供这些资源,这将由 Android 自动完成。

显示密度的比例设置如下:

  • xhdpi: 2.0
  • 高清: 1.5
  • mdpi: 1.0
  • 低密度脂蛋白: 0.75

这意味着您的xhdpi资源在中等密度显示器上缩小了 2.0 倍。这可能不利于质量,这就是为什么通常建议自己创建和提供这些低密度资源的原因。

现在,回到手头的问题。拥有非常小的宽度或高度(1 或 2 像素)的资源并不少见。一个用例的示例是为视图提供纯色背景。

不幸的是,当提供这些资源xhdpi并缩小它们时,像素大小可能会被截断为 0。对此没有适当的保护措施,Android 将无法创建具有该尺寸的位图并崩溃。

有几种解决方案:

  • 将资源包括在内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-03-15T09:11:51.327 回答