No se encontró recurso de Android debido al ancho y altura

He publicado recientemente una aplicación de Android en la tienda que funcionó perfectamente para casi todos mis usuarios. Sin embargo, pronto comencé a recibir algunos informes de fallo a la semana con el siguiente rastreo:

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 

No es fácil determinar qué es exactamente lo que está pasando aquí. La única cosa que podía recopilar de los informes de usuario era que parecía ocurrir principalmente en dispositivos con pantallas de baja densidad. Este recurso específico se utiliza como fondo para una vista en una interfaz de usuario de XML.

    El problema aquí es causado por una combinación desafortunada de la escala automática de recursos drawable en androide y de los drawables muy pequeños.

    Si, por ejemplo, su aplicación solo proporciona recursos de drawable-xhpdi , es necesario drawable-xhpdi para que se ajusten a pantallas de densidad más baja. Esto se realiza automáticamente por Android si no proporciona estos recursos usted mismo.

    La escala de densidades de visualización se establece de la siguiente manera:

    • Xhdpi: 2.0
    • Hdpi: 1.5
    • Mdpi: 1.0
    • Ldpi: 0,75

    Esto significa que los recursos xhdpi se reducen por un factor 2.0 en las pantallas de densidad media. Esto puede ser perjudicial para la calidad, por lo que se recomienda generalmente para crear y proporcionar estos recursos de baja densidad a ti mismo.

    Ahora, de vuelta al problema en cuestión. No es raro tener un recurso que tiene una anchura o altura muy pequeña (1 o 2 píxeles). Un ejemplo de un caso de uso es proporcionar un fondo de color sólido para una vista.

    Desafortunadamente, al proporcionar estos recursos como xhdpi y xhdpi , el tamaño de píxel puede ser truncado a 0. No hay ningún guardia en su lugar para esto y Android no podrá crear un mapa de bits con esa dimensión y bloqueo.

    Hay varias soluciones para esto:

    • Incluya el recurso como ldpi y ldpi que se ldpi en su lugar, lo cual no afecta al propósito como fondo.
    • Incluya el recurso como nodpi y nunca se escalará.
    • Utilice un recurso XML en su lugar.

    La última opción describe con mayor precisión la intención y le permite cambiar fácilmente el color más adelante sin un programa de edición de imágenes:

     <?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> 

    Incluya este recurso en la carpeta drawables y siempre funcionará correctamente.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.