Java 画布和位图变量设置为空

Java 画布和位图变量设置为空,java,android,canvas,bitmap,Java,Android,Canvas,Bitmap,我正在为android开发一个简单的绘图应用程序。这个应用程序的结构很简单——它有一个包含文本的MainActivity类和一个按钮,该按钮用于扩展第二个类,一个包含图形的自定义视图 主类的代码如下所示: public class MainActivity extends AppCompatActivity { DrawingView dv; ViewGroup parent; @Override protected void onCreate(Bundle savedInstanceSta

我正在为android开发一个简单的绘图应用程序。这个应用程序的结构很简单——它有一个包含文本的MainActivity类和一个按钮,该按钮用于扩展第二个类,一个包含图形的自定义视图

主类的代码如下所示:

public class MainActivity extends AppCompatActivity {

DrawingView dv;
ViewGroup parent;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    parent = (ViewGroup) findViewById(R.id.activity_main);
}

public void crossClass(View v) {
    //setContentView(R.layout.sample_drawing_view);
    dv = new DrawingView(getApplicationContext());
    View viw = getLayoutInflater().inflate(R.layout.sample_drawing_view, parent);
    System.out.println("Attempted to Inflate DV");

}


public void refreshCallback(View v){
    dv.refresh();
}

}
该类最重要的部分是创建DrawingView的实例,以便稍后在按下按钮时调用该类中的方法

方法(dv.refresh())很简单

public void refresh(){
    System.out.println("Refresh Command Sent");
    drawCanvas.drawColor(Color.WHITE);
    invalidate();
}
它所做的只是在画布上画白色

这给了我一个错误:

java.lang.NullPointerException: Attempt to invoke virtual method void android.graphics.Canvas.drawColor(int) on a null object reference
我使用调试器进行了一些检查,发现在调用该方法时,Canvas和Bitmap变量为null

但是,当我将断点设置为刚创建类之后,变量就不是null

我将把整个工程视图类代码放在下面,但我不知道是什么导致它们变为null

public class DrawingView extends View
{
//Constant
public int Colour = 0xFF000000;
public int width;
public int height;

//Drawing Var
public Canvas drawCanvas;
public Bitmap canvasBitmap;
public Path drawPath;
public Paint drawPaint;
public Paint canvasPaint;


public DrawingView(Context context){
    super(context);
    get_dim(context);
    setupDrawing();
    setupUI();
}

public DrawingView(Context context, AttributeSet attributeSet){
    super(context, attributeSet);
    setupDrawing();
    setupUI();
}

public void get_dim(Context context){
    WindowManager wm = (WindowManager)   context.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    width = size.x;
    height = size.y;

}

public void setupUI() {

}

public void setupDrawing() {
    drawPath = new Path();
    drawPaint = new Paint();

    drawPaint.setColor(Colour);

    drawPaint.setAntiAlias(true);
    drawPaint.setStrokeWidth(20);
    drawPaint.setStyle(Paint.Style.STROKE);
    drawPaint.setStrokeJoin(Paint.Join.ROUND);
    drawPaint.setStrokeCap(Paint.Cap.ROUND);

    canvasPaint = new Paint(Paint.DITHER_FLAG);
}

@Override
protected void onDraw(Canvas canvas){
    canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
    canvas.drawPath(drawPath, drawPaint);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh){
    super.onSizeChanged(w, h, oldw, oldh);
    System.out.println("ON SIZE CHANGED CALLED");
    canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    drawCanvas = new Canvas(canvasBitmap);
}

public void handelAction(int action, int x, int y){
    switch(action) {
        case 0:
            drawPath.moveTo(x, y);
            break;
        case 2:
            drawPath.lineTo(x, y);
            break;
        case 1:
            drawCanvas.drawPath(drawPath, drawPaint);
            break;
    }
    {
        invalidate();
    }
}

@Override
public boolean onTouchEvent(MotionEvent event){
    float x = event.getX();
    float y = event.getY();

    System.out.println(event.getAction());
    handelAction(event.getAction(), (int) x, (int) y);
    return true;
}

public void refresh(){
    System.out.println("Refresh Command Sent");
    drawCanvas.drawColor(Color.WHITE);
    invalidate();
}

}

crossClass()
中分配给
dv
DrawingView
从未真正使用过。您没有在任何地方将其添加到
活动
视图
层次结构中。另外,它与您在下一行中可能正在膨胀的
DrawingView
实例不同。如果在
示例图视图
布局中确实有一个,那么您需要从正在膨胀的
视图
中获取对该视图的引用。啊,我想可能是这样的。这是一个问题已经有一段时间了,我对它的工作原理缺乏关键性的理解。可以有没有一种方法可以使我刚通过编程创建的DrawingView膨胀?我不确定你的意思。如果要使用通过
new
实例化的一个,请删除
inflate()
行,并使用
addView()
方法将
dv
添加到
父级
。如果要使用已充气的,请删除
new
行,然后以某种方式找到
DrawingView
并将其分配给
dv
;如果
元素具有
id
,则可以使用
findViewById()
,或者如果它是
示例\u绘图\u视图
布局中唯一的
视图
,则可以从
充气()
调用中释放返回值。是。非常感谢。告诉我使用addView()正是我所需要的。如果你不介意的话,我还有一个简短的问题。当我使用addView()时,DrawingView工作得非常好,但是没有创建我在.xml文件中定义的按钮。如何手动创建此按钮?请在OnCreate()中使用