2016-08-17 6 views
1

私のコードでは、私はframeLayoutにキャンバスを描画しようとしていますが、nullオブジェクト参照例外が発生しています。ちなみに私がColor.BLACKを変更したときは、黒い矩形だけを表示してエラーを表示するだけの変更はありません。 私は2.1とgenymotionアンドロイドエミュレータ6.0マシュマロdrawColorのAndroid Nullポインタ例外

エラーアンドロイドスタジオを使用するには、そのようなものです:

Fatal Exception:main 
Process:com.example.myApp 
java.lang.NullPointerException : Attempt to invoke virtual method "void android.graphics.Canvas.rawColor(int)" on a null object reference 

public class MyCanvas extends SurfaceView implements SurfaceHolder.Callback{ 

    private boolean mRun= false; 
    private final SurfaceHolder mSurfaceHolder; 
    private final Object mRunLock = new Object(); 

    public MyCanvas(Context context, AttributeSet attrs){ 

     super(context,attrs); 
     this.setWillNotDraw(false); 
     mSurfaceHolder = getHolder(); 
     mSurfaceHolder.AddCallback(this); 
    } 

    public synchronized void run(){ 

     if(mRun){ 

      Canvas c = null; 
      try{ 

       c = mSurfaceHolder.lockCanvas(); 
       synchronized (mSurfaceHolder){ 
        synchronized(mRunLock){ 
         if(mRun) doDraw(c); 
        } 

       } 

      }finally 
       if(c != null) 
       { mSurfaceHolder.unlockCanvasandPost(c); } 

     } 


    } 


    private void onDraw(Canvas canvas){ 
     canvas.drawColor(Color.YELLOW); 
    } 
} 

私の活動のレイアウトコードはここにあります。

<view class="com.example.myapp.MyCanvas" 
    android:layout_width="200dp" 
    android:layout_height="200dp" 
    android:lid="@+id/mycanvas" 
/> 

私の活動のクラスには、問題がlockCanvasから返されたキャンバスがnullであることで、ここで

MyCanvas myCanvas = (MyCanvas)findViewById(R.id.mycanvas); 
myCanvas.run(); 

答えて

1

です。

ドキュメントを引用:

返さキャンバスは、表面のビットマップに描画するために使用することができます。 A サーフェスが作成されていないか、または を編集できない場合はnullが返されます。サーフェスが で使用可能な場合は、通常、 Callback.surfaceCreatedを実装する必要があります。

したがって、Callback.surfaceCreatedを実装し、surfaceCreatedの呼び出し後にキャンバスの編集を開始する必要があります。

+1

ありがとうsurfacedestroyedメソッドが機能しました。破棄時にmRunをfalseに割り当てると、エラーはなくなりました。 –