【问题标题】:NullPointer of Bitmap in Draw methodDraw方法中Bitmap的NullPointer
【发布时间】:2012-10-01 13:36:08
【问题描述】:

我正在尝试在画布上绘制位图。位图返回 null,但我不明白为什么。我已经阅读了 Bitmap 和 decodeResources 的文档。由于 decode 找不到它,drawable 似乎返回 null 。我试图使用调试会话,但我没有走得太远。

请就空异常提出建议。

错误类:

public class SnapShot extends Activity {

private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

public void draw(Canvas canvas) {
    drawIcon(canvas);    
}

private void drawIcon(Canvas canvas) {
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.buttongreen); //this is line 36
    canvas.drawBitmap(bitmap, 150, 150, paint);
}

}

堆栈跟踪:

10-01 09:24:30.638: E/AndroidRuntime(27206): FATAL EXCEPTION: main
10-01 09:24:30.638: E/AndroidRuntime(27206): java.lang.NullPointerException
10-01 09:24:30.638: E/AndroidRuntime(27206):    at android.content.ContextWrapper.getResources(ContextWrapper.java:80)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at com.game.SnapShot.drawIcon(SnapShot.java:36)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at com.game.SnapShot.draw(SnapShot.java:29)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at com.game.onDraw(AugmentedView.java:77)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at android.view.View.draw(View.java:6880)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at android.view.View.draw(View.java:6883)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at android.widget.FrameLayout.draw(FrameLayout.java:357)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at android.view.View.draw(View.java:6883)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at android.widget.FrameLayout.draw(FrameLayout.java:357)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1862)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at android.view.ViewRoot.draw(ViewRoot.java:1522)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at android.view.ViewRoot.performTraversals(ViewRoot.java:1258)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at android.os.Handler.dispatchMessage(Handler.java:99)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at android.os.Looper.loop(Looper.java:130)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at android.app.ActivityThread.main(ActivityThread.java:3683)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at java.lang.reflect.Method.invokeNative(Native Method)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at java.lang.reflect.Method.invoke(Method.java:507)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
10-01 09:24:30.638: E/AndroidRuntime(27206):    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 需要更多信息,也许在第 36 行设置一个断点,看看 null 对象是什么。
  • @Souvlaki 使用调试器告诉我 ViewRoot.draw(boolean) 返回 null。如果找不到位图的 int id,则通过阅读 decodeResource 的工作原理,它会返回 null。但是使用 R.drawable 格式应该返回 id 对吗?它可以编译,所以我假设它可以在方法中找到可绘制的罚款..

标签: android canvas bitmap


【解决方案1】:

如果你在视图中编写 drawIcon(Canvas canvas) 方法,那么你应该有一个上下文来调用 getResource()。

例如:

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.buttongreen);
    canvas.drawBitmap(bitmap, 150, 150, paint);

【讨论】:

  • 非常感谢。对于其他任何人,我必须从实际活动中传递上下文,因为此类是叠加层..所以尝试“draw(Canvas canvas,Context context)”,它会起作用
猜你喜欢
  • 2012-03-18
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多