2016-05-10 14 views
1

私は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); 
} 

}

答えて

0
  1. あなたの目標はSurfaceViewの表面上に描画する場合とは対照的に、(onDraw()を上書きしないでください。 SurfaceViewのビュー)。 onDraw()custom viewsです。本当にサーフェスを使用する場合は、メソッドの名前を別の名前にします。
  2. 静止画像を投稿している場合を除き、surfaceChanged()にしか描画しないでください。このメソッドは、サーフェスのサイズが変更されない限り、サーフェスが最初に作成されたときに通常1回呼び出されます。ビットマップから静的なイメージだけが必要な場合は、代わりにImageViewを使用することを検討してください。
  3. lockCanvas()が成功するとは限りません。 surfaceChanged()から呼び出すのはかなり安全ですが、一般的には戻り値を確認する必要があります。
  4. BitmapFactory.decodeResource()が成功するとは限りません。

あなたdrawColor()呼び出しが成功している、とあなたdrawBitmap()呼び出しが失敗しているので、私の推測では、mBMPFieldがnullであるということです。画像データをデコードすることができなかった場合

[戻り値]デコードビットマップ、またはnull、...

それが例外をスローしませ、エラー時にnullを返します:decodeResource()のためのドキュメントによると、 、戻り値をチェックする必要があります。

+0

私は 'onDraw()'からのオーバーライドをクリアして名前を変更しました。私は静的な画像を適切な場所に設定したいので、このimageViewでは十分でしょうか?私はトップの近くに 'mBMPField'を定義しようとしましたが、プライベートを使用してハングアップしますか?私はあなたの助けを大変感謝しています。私はAndroidとJavaの両方にかなり新しいですが、むしろ勉強に興奮しています。 – cleverCorvid

+0

あなたが新しい人なら、私はSurfaceViewから離れています。カスタムビュー(答えのリンクを参照)を使用するか、スタティックビットマップを表示するためのImageViewだけを使用してください。 'decodeResource()'は失敗していますか?もしそうなら、なぜですか?戻り値を記録し、logcat出力を確認します。 – fadden

+0

私はこのエラーをlogcat: '05-10 18:43:40.389 2461-2583/edu。#########。treasurehunter _ ##から取得しています。 ######### E/Surface:getSlotFromBufferLocked:未知のバッファ:0xb4058040' – cleverCorvid

0

私はコンストラクタ内に初期化関数を記述していませんでした。だから私はInit()を使い始めました。私はそれを働かせた。指針と方向性についてもう一度感謝します。それがなければ、私はこの部分に気付かなかっただろう。

関連する問題