Java 视图中的空指针

Java 视图中的空指针,java,android,android-layout,android-view,Java,Android,Android Layout,Android View,我已经将另一个活动中的自定义视图实现为XML布局。视图工作并显示画布颜色,但一旦将要绘制到画布的信息传递给视图,程序就会终止。问题似乎来自mPath,我认为这可能与位图大小不同于xml布局有关 这个程序似乎与mPath有关 这是内部带有自定义视图的活动的代码,我必须将一些变量设置为静态以便显示,这可能是导致其无法工作的一个因素 public class ClientActivity extends GraphicsActivity implements ColorPickerDialog.OnC

我已经将另一个活动中的自定义视图实现为XML布局。视图工作并显示画布颜色,但一旦将要绘制到画布的信息传递给视图,程序就会终止。问题似乎来自mPath,我认为这可能与位图大小不同于xml布局有关

这个程序似乎与mPath有关

这是内部带有自定义视图的活动的代码,我必须将一些变量设置为静态以便显示,这可能是导致其无法工作的一个因素

public class ClientActivity extends GraphicsActivity
implements ColorPickerDialog.OnColorChangedListener {


@Override
public void setContentView(View view) {
    super.setContentView(view);
}

static ClientNetwork net = new ClientNetwork();
static Thread fred = new Thread(net);
static int col;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(new MyView(this));
    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setDither(true);
    mPaint.setColor(Color.BLACK);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeJoin(Paint.Join.ROUND);
    mPaint.setStrokeCap(Paint.Cap.ROUND);
    mPaint.setStrokeWidth(20);



    mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 },
            0.4f, 6, 3.5f);

    mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL);

}

private static Paint mPaint;
private MaskFilter  mEmboss;
private MaskFilter  mBlur;



public static class MyView extends View {



    private static final float MINP = 0.25f;
    private static final float MAXP = 0.75f;

    private Bitmap  mBitmap;
    private Canvas  mCanvas;
    private Path    mPath;
    private Paint   mBitmapPaint;
    private boolean con;

    public MyView(Context c) {
        super(c);

        mPath = new Path();
        mBitmapPaint = new Paint(Paint.DITHER_FLAG);
    }

    public MyView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }


    public MyView(Context context, AttributeSet attrs ) {
        super(context, attrs);
    }


    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        mCanvas = new Canvas(mBitmap);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);

        con = fred.isAlive();

        if(con == false)
        {
            fred.start();
        }


        canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

        Drawring fromNet;
        if((fromNet = net.GetServerDraw())!= null){

            //Drawring fromNet = net.GetServerDraw();
            net.resetpos();
            int position = fromNet.getPos();
            //col = fromNet.getColor();
            //colorChanged(col);

            float x = fromNet.getMx();
            float y = fromNet.getMy();





            switch (position) {
            case 1: 
                try {
                    touch_start(x, y);
                } catch (IOException e1) {
                    e1.printStackTrace();
                }


                break;
            case 2:
                try {
                    touch_move(x, y);
                } catch (IOException e1) {
                    e1.printStackTrace();
                }


                break;
            case 3:
                try {
                    touch_up();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                break;
            }
            mCanvas.drawPath(mPath, mPaint);
            invalidate();
        }

        invalidate();
    }
    private float mX, mY;
    private static final float TOUCH_TOLERANCE = 4;

    private void touch_start(float x, float y) throws IOException {
        mPath.reset();
        mPath.moveTo(x, y);
        mX = x;
        mY = y;

        Log.d(null, "1st Position");
    }
    private void touch_move(float x, float y) throws IOException {
        float dx = Math.abs(x - mX);
        float dy = Math.abs(y - mY);
        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
            mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
            mX = x;
            mY = y;

            Log.d(null, "2nd Position");
        }
    }


    private void touch_up() throws IOException  {
        mPath.lineTo(mX, mY);

        // commit the path to our offscreen
        mCanvas.drawPath(mPath, mPaint);
        // kill this so we don't double draw
        mPath.reset();
        Log.d(null, "3rd Position");
    }

    public void colorChanged(int color) {
        mPaint.setColor(col);
    }
}

@Override
public void colorChanged(int color) {
    mPaint.setColor(col);

}
}
这是XML的代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:orientation="vertical" android:weightSum="1">


<RelativeLayout android:id="@+id/relativeLayout2"
    android:layout_height="wrap_content" android:layout_width="match_parent"
    android:layout_weight="0.99">

    <view class="com.DrawTastic.ClientActivity$MyView"

        android:id="@+id/MyView1" android:layout_gravity="center"   android:layout_height="match_parent" android:layout_width="match_parent"/>


</RelativeLayout>


<RelativeLayout android:id="@+id/relativeLayout1"
    android:layout_width="match_parent" android:layout_height="144dp">
    <EditText android:layout_height="wrap_content" android:id="@+id/input"
        android:layout_width="250dp" android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true">
        <requestFocus></requestFocus>
    </EditText>
    <Button android:layout_height="wrap_content" android:id="@+id/send"
        android:layout_width="wrap_content" android:text="Send"
        android:onClick="sent" android:layout_alignParentBottom="true"
        android:layout_toRightOf="@+id/input"
        android:layout_alignParentRight="true"></Button>
    <ListView android:id="@+id/listView" android:layout_width="match_parent"
        android:layout_above="@+id/input" android:layout_alignParentRight="true" android:layout_height="100dp"></ListView>
</RelativeLayout>

尝试复制您的初始化逻辑

mPath = new Path();
mBitmapPaint = new Paint(Paint.DITHER_FLAG);
其他构造函数,例如

public MyView(Context context, AttributeSet attrs, int defStyle)
public MyView(Context context, AttributeSet attrs)
试着改变
    android:id="@+id/MyView1" android:layout_gravity="center"   android:layout_height="match_parent" android:layout_width="match_parent"/>


也在其他构造函数中进行初始化

public MyView(Context c) {
        super(c);

        mPath = new Path();
        mBitmapPaint = new Paint(Paint.DITHER_FLAG);
    }

    public MyView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mPath = new Path();
        mBitmapPaint = new Paint(Paint.DITHER_FLAG);
    }


    public MyView(Context context, AttributeSet attrs ) {
        super(context, attrs);
        mPath = new Path();
        mBitmapPaint = new Paint(Paint.DITHER_FLAG);
    }

好的,这似乎已经解决了我的问题,但现在它在mCanvas.drawPath(mPath,mPaint)上抛出了另一个空指针;这是坐标实际绘制到画布上的地方,你知道我如何修复它吗?你没有初始化mCanvas。mcanvas=画布或mcanvas=新画布();在所有构造函数中初始化MCANVAS后,我仍然收到相同的错误,我将把堆栈发布到原始post。错误发生在mCanvas.drawPath(mPath,mpain);尝试使用mCanvas.drawPath(mPath,ClientActivity.mpain);
<com.DrawTastic.ClientActivity$MyView
   android:id="@+id/MyView1" 
   android:layout_gravity="center"       
   android:layout_height="match_parent" 
   android:layout_width="match_parent"/>
public MyView(Context c) {
        super(c);

        mPath = new Path();
        mBitmapPaint = new Paint(Paint.DITHER_FLAG);
    }

    public MyView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mPath = new Path();
        mBitmapPaint = new Paint(Paint.DITHER_FLAG);
    }


    public MyView(Context context, AttributeSet attrs ) {
        super(context, attrs);
        mPath = new Path();
        mBitmapPaint = new Paint(Paint.DITHER_FLAG);
    }