android decodeResource为xml位图返回null - API级别7

时间:2011-12-03 19:26:01

标签: android

我有一个奇怪的情况:将我的PNG从/ drawable-hdpi /移动到/ drawable /并将XML位图放到/ drawable-hdpi /后,我无法使用BitmapFactory.decodeResource()方法解码这些位图 - 它返回null。 更奇怪的是:

  1. 我可以使用此方法解析实际的png文件(给出实际的可绘制ID)
  2. 我可以使用context.getResources().getDrawable(xml_id) -
  3. 获取drawable
  4. 所有ImageViews组件都已正确解码(但这是由于第2页我认为)
  5. 我在logcat中看到的是:

      

    12-03 16:18:13.557:D / skia(2566):--- SkImageDecoder :: Factory返回null   12-03 16:18:13.557:D / skia(2566):--- SkImageDecoder :: Factory返回null   12-03 16:18:13.567:D / skia(2566):--- SkImageDecoder :: Factory返回null

    所以我会猜测解码器被给予xml文件来解码而不是实际的资源(我检查过它是有效的)。

    任何提示?是否可以使用xml位图BitmapFactory.decodeResource()? 顺便说一下,我正在使用API​​ 7。

    我也尝试将原始lpngs放入drawable-nodpi,但这也无济于事。 感谢

4 个答案:

答案 0 :(得分:8)

获取drawable,然后转换为Bitmap:

Drawable drawable = getResources().getDrawable(resId);
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();

现在您可以使用Bitmap对象。

答案 1 :(得分:1)

XML位图是XML中定义的指向位图文件的资源。效果是原始位图文件的别名。 XML可以为位图指定其他属性,例如抖动和平铺。

http://developer.android.com/guide/topics/resources/drawable-resource.html

我遇到了同样的问题,但我将其用作解决方法。不幸的是,在解码流时,我没有看到任何传递Options的方法。

            //init input stream
    is = getContext().getResources().openRawResource(resID);

    Bitmap returnBitmap;

    //Load bitmap directly - will fail if xml
    Bitmap newBmp = BitmapFactory.decodeStream(is, options);
    if(newBmp == null){
        //Load bitmap from drawable auto scales
        newBmp = ((BitmapDrawable) getContext().getResources().getDrawable(resID)).getBitmap();
    }

答案 2 :(得分:0)

尝试将xml位图链接到另一个xml位图(如此

)时也会发生此错误
<bitmap
  android:src="@drawable/glow"
  android:tileMode="disabled" android:gravity="center" >
</bitmap> 

其中“glow”是另一个xml位图。

答案 3 :(得分:-1)

世界上什么是XML位图? BitmapFactory.decodeResource()加载一个位图图像 - 你应该使用PNG或JPEG图像,没有别的。

请停止随机投入-hdpi和-nodpi等等。对于给定的资源名称,所有不同的dpi限定符或诸如此类的东西都提供不同的变体。你不应该有一些位图和其中一些XML文件,将-nodpi与其他变体混合也没有意义。