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
  • hdpi: 1.5
  • mdpi: 1.0
  • ldpi: 0.75

つまりxhdpi、中密度ディスプレイではリソースが 2.0 倍に縮小されます。これは品質に悪影響を及ぼす可能性があるため、通常、これらの低密度リソースを自分で作成して提供することをお勧めします。

さて、当面の問題に戻ります。リソースの幅または高さが非常に小さい (1 または 2 ピクセル) ことは、まったく珍しいことではありません。ユースケースの例は、ビューに単色の背景を提供することです。

残念ながら、これらのリソースを as として提供xhdpiし、それらを縮小すると、ピクセル サイズが 0 に切り捨てられる可能性があります。これに対するガードはなく、Android はそのサイズでのビットマップの作成に失敗し、クラッシュします。

これにはいくつかの解決策があります。

  • リソースを as として含め、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 に答える