私はAndroid Studioで行っているプロジェクトでNullPointerExceptionを実行し続けます。 DrawSurfaceを呼び出すカスタムクラスに画像を表示する必要があります。私は私の問題に関連するものを見つけることができないようです。以前のさまざまな質問をチェックし、非常に多くの動画を見ました。カスタムクラスのAndroid SurfaceView
私が投げてるエラーは次のようになります。
android.graphics.Canvas.drawBitmapでandroid.graphics.Canvas.throwIfCannotDraw(Canvas.java:1269)でのjava.lang.NullPointerException(キャンバス.java:1325)edu。########。#####。cse.treasurehunter。##########。DrawSurface.onDraw_Original(DrawSurface.java:60)at EDU。########。#####。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);
}
}
私は 'onDraw()'からのオーバーライドをクリアして名前を変更しました。私は静的な画像を適切な場所に設定したいので、このimageViewでは十分でしょうか?私はトップの近くに 'mBMPField'を定義しようとしましたが、プライベートを使用してハングアップしますか?私はあなたの助けを大変感謝しています。私はAndroidとJavaの両方にかなり新しいですが、むしろ勉強に興奮しています。 – cleverCorvid
あなたが新しい人なら、私はSurfaceViewから離れています。カスタムビュー(答えのリンクを参照)を使用するか、スタティックビットマップを表示するためのImageViewだけを使用してください。 'decodeResource()'は失敗していますか?もしそうなら、なぜですか?戻り値を記録し、logcat出力を確認します。 – fadden
私はこのエラーをlogcat: '05-10 18:43:40.389 2461-2583/edu。#########。treasurehunter _ ##から取得しています。 ######### E/Surface:getSlotFromBufferLocked:未知のバッファ:0xb4058040' – cleverCorvid