【问题标题】:Null Pointer Exception in Bitmap.decodeResources() from xml resourcexml 资源中 Bitmap.decodeResources() 中的空指针异常
【发布时间】:2014-04-16 16:59:04
【问题描述】:

在我当前的 android 项目中,我从 xml 资源创建了两个位图。每次我使用 xml 位图作为 Bitmap.decodeResources() 的资源来构建我的项目时,当我尝试访问位图时都会出现空指针异常。但是当我切换到使用直接的 .png 时,错误就消失了。

为什么decodeResources() 返回 null?

创建位图的代码:

public OvertButton(float x, float y, float width, float height, int pressedId, int  unPressedId, Resources res, boolean visible) {
    \\these are null if xml bitmap is passed
    pressed = BitmapFactory.decodeResource(res, pressedId); 
    unPressed = BitmapFactory.decodeResource(res, unPressedId);

    this.visible = visible;
    relocate(x, y);
    resize(width, height); //throws NPE when I createScaledBitmap()

    ClickableManager.registerClickable(this);
}

资源文件

<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/play_button_pressed"
    android:filter="false"
    android:antialias="false"
    android:dither="false"/>

和resize方法

@Override
    public void resize(float width, float height) {
        box.set(box.left, box.top, box.left + width, box.top + height);
        Log.d("resize",String.valueOf(height));
        pressed = Bitmap.createScaledBitmap(pressed, (int)width, (int)height, true);
        unPressed = Bitmap.createScaledBitmap(unPressed, (int)width, (int)height, true);
    }

还有日志猫

04-16 09:45:06.341  11824-11824/com.handmade.eed D/dalvikvm﹕ Late-enabling CheckJNI
04-16 09:45:06.450  11824-11824/com.handmade.eed D/MenuActivity﹕ 2130837594$$$2130837596
04-16 09:45:06.451  11824-11824/com.handmade.eed D/skia﹕ --- SkImageDecoder::Factory returned null
04-16 09:45:06.451  11824-11824/com.handmade.eed D/OvertButton﹕ true2130837591
04-16 09:45:06.457  11824-11824/com.handmade.eed D/OvertButton﹕ false2130837595
04-16 09:45:06.457  11824-11824/com.handmade.eed D/resize﹕ 252.0
04-16 09:45:06.458  11824-11824/com.handmade.eed D/AndroidRuntime﹕ Shutting down VM
04-16 09:45:06.459  11824-11824/com.handmade.eed W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41610d40)
04-16 09:45:06.461  11824-11824/com.handmade.eed E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.handmade.eed, PID: 11824
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.handmade.eed/com.handmade.eed.MenuActivity}: java.lang.NullPointerException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2269)
            at android.app.ActivityThread.access$800(ActivityThread.java:139)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5102)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:615)
            at com.handmade.overt.visible.OvertButton.resize(OvertButton.java:61)
            at com.handmade.overt.visible.OvertButton.<init>(OvertButton.java:29)
            at com.handmade.overt.visible.OvertButton.<init>(OvertButton.java:34)
            at com.handmade.eed.MenuActivity.onCreate(MenuActivity.java:72)
            at android.app.Activity.performCreate(Activity.java:5248)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2173)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2269)
            at android.app.ActivityThread.access$800(ActivityThread.java:139)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5102)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)
04-16 09:45:09.872  11824-11824/com.handmade.eed I/Process﹕ Sending signal. PID: 11824 SIG: 9

【问题讨论】:

  • 发布 resize() 方法..
  • 已发布。它只是createScaledBitmap
  • 您是否传递了正确的 ID??
  • @kalyanpvs 是的,这就是我感到困惑的原因。如果我通过R.drawable.play_button_pressed_res(上面的xml),它会抛出一个NPE,但如果我通过R.drawable.play_button_pressed(png),程序将运行良好。

标签: java android xml bitmap


【解决方案1】:

这是我愚蠢的情况,但这是后代的答案。 BitmapBitmapDrawable不一样

从上面的 Drawable Resources 链接:

编译的资源数据类型:
指向 BitmapDrawable 的资源指针。

因此我不得不改变这个:

Bitmap pressed = BitmapFactory.decodeResource(res, R.drawable.play_button_pressed_res); //this is the id for the xml referring to the png

到此:

Drawable pressed = res.getDrawable(R.drawable.play_button_pressed_res);

或者这个:

Bitmap pressed = BitmapFactory.decodeResource(res, R.drawable.play_button_pressed); //this is the id for the png 

我决定使用bitmap,因为据我所知,它更快。

【讨论】:

    猜你喜欢
    • 2021-06-05
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多