2013-03-15 8 views
7

最近、ほぼすべてのユーザーに完全に機能する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のビューの背景として使用されます。

答えて

22

ここでの問題は、Androidの描画可能なリソースの自動スケーリングと非常に小さな描画可能な組み合わせの不幸な組み合わせが原因です。

たとえば、お使いのアプリがリソースを提供するのはdrawable-xhpdiなので、低密度画面に合わせて縮小する必要があります。これらのリソースを自分で提供しないと、これはAndroidによって自動的に行われます。

  • xhdpi: 2.0
  • hdpi: 1.5
  • MDPI: 1.0
  • LDPI:

    表示濃度の尺度は次のように設定されています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フォルダにこのリソースを含めると、それは常に正常に動作します。

+0

あなたの優れた答えをありがとうございました! –

+0

@EladNava喜んで誰かを助けることができます:) – Overv

+0

ニースの解説と素敵な説明:この問題は私には時間がかかりすぎます:Dとこの問題を抱える他の人は、9パッチの画像すべてを置くことをお勧めします。 Overvが推奨するようにdrawablesフォルダに入れます:) – hqt

関連する問題