所以我继续使用我在Android Studio中执行的项目遇到NullPointerException。我需要在我调用DrawSurface的自定义类中显示一个图像。我似乎无法找到与我的问题有关的任何事情。我已经检查了以前的各种问题并观看了很多视频。
我抛出的错误看起来像这样:
在Android.graphics.Canvas.drawBitmap(Canvas.java:1325)的edu。########上的android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1269)中的java.lang.NullPointerException。 #####。cse.treasurehunter。###########。在edu的DrawSurface.onDraw_Original(DrawSurface.java:60)。########。#####。 cse.treasurehunter。###########。DrawSurface.onDraw(DrawSurface.java:-1)
我的.xml看起来像这样:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="fill_parent" android:orientation="vertical" tools:context=".MainActivity">
<edu.########.####.cse.treasurehunter.###########.DrawSurface android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" android:id="@+id/dsField"/>
<LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="50dp">
<Button android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="0.5" android:text="View Inventory" android:id="@+id/btnInventory"/>
<Button android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="0.5" android:text="Credits" android:id="@+id/btnCredits"/>
</LinearLayout>
我的DrawSurface类看起来像这样:
public class DrawSurface extends SurfaceView {
private Bitmap mBMPField;
private SurfaceHolder holder;
public DrawSurface(Context context) {
super(context);
holder = getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Canvas c = holder.lockCanvas();
onDraw(c);
holder.unlockCanvasAndPost(c);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
});
mBMPField = BitmapFactory.decodeResource(getResources(), R.drawable.field);
}
public DrawSurface(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DrawSurface(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.DKGRAY);
canvas.drawBitmap(mBMPField, 100, 200, null);
}
}
答案 0 :(得分:0)
onDraw()
。 onDraw()
适用于custom views。如果您真的想使用Surface,请将该方法命名为其他内容。surfaceChanged()
中绘图。首次创建Surface时,通常会调用该方法一次,除非某些内容更改了Surface的大小。如果您只想从Bitmap获取静态图像,请考虑使用ImageView。lockCanvas()
会成功。你可以非常安全地从surfaceChanged()
调用它,但通常你会想要检查返回值。BitmapFactory.decodeResource()
会成功。由于您的drawColor()
来电成功,而drawBitmap()
来电失败,我的猜测是mBMPField
为空。根据{{1}}的文档:
[返回]已解码的位图,如果无法解码图像数据,则返回null,...
它在出错时返回null,而不是抛出异常,所以你需要检查返回值。
答案 1 :(得分:0)
好的,发生的事情是我没有在我的构造函数中声明的初始化函数。所以一旦我开始使用Init();我搞定了。再次感谢您的指示和方向。没有它我就不会注意到这一部分。