使用onDraw()创建自定义视图时出现NullPointerException

W.K*_*K.S 2 android view nullpointerexception

我正在创建一个我添加到FrameLayout的自定义视图.当我初始化视图时,我得到一个NullPointerException.我究竟做错了什么.该视图的代码是:

public class DocumentCameraMask extends View {

    private Context mContext;

    public DocumentCameraMask(Context context) {
        super(context);

        this.mContext = context;
    }

    @Override
    public void draw(Canvas canvas) {
        // TODO Auto-generated method stub

        Paint paint = new Paint();
        paint.setColor(this.mContext.getResources().getColor(R.color.textColor));
        paint.setStyle(Paint.Style.STROKE);

        Rect cropRect = new Rect(0,0,800,600);
        canvas.drawRect(cropRect, paint);

        super.draw(canvas);

    }

}
Run Code Online (Sandbox Code Playgroud)

cropRect大小将动态计算,这就是我需要创建此视图的原因.谢谢你的帮助.

logcat的

09-11 19:13:04.590:E/AndroidRuntime(4235):FATAL EXCEPTION:main 09-11 19:13:04.590:E/AndroidRuntime(4235):java.lang.RuntimeException:无法启动活动DocumentCameraActivity}:java .lang.NullPointerException 09-11 19:13:04.590:E/AndroidRuntime(4235):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)09-11 19:13:04.590:E/AndroidRuntime(4235) :在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2211)09-11 19:13:04.590:E/AndroidRuntime(4235):在android.app.ActivityThread.access $ 600(ActivityThread.java:149)09- 11 19:13:04.590:E/AndroidRuntime(4235):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1300)09-11 19:13:04.590:E/AndroidRuntime(4235):在android. os.Handler.dispatchMessage(Handler.java:99)09-11 19:13:04.590:E/AndroidRuntime(4235):在android.os.Looper.loop(Looper.java:153)09-11 19:13:04.590:E/AndroidRuntime(4235):在android.app.ActivityThread.main(ActivityThread.java) :4987)09-11 19:13:04.590:E/AndroidRuntime(4235):at java.lang.reflect.Method.invokeNative(Native Method)09-11 19:13:04.590:E/AndroidRuntime(4235):at java.lang.reflect.Method.invoke(Method.java:511)09-11 19:13:04.590:E/AndroidRuntime(4235):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java) :821)09-11 19:13:04.590:E/AndroidRuntime(4235):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)09-11 19:13:04.590:E/AndroidRuntime (4235):at dalvik.system.NativeStart.main(Native Method)09-11 19:13:04.590:E/AndroidRuntime(4235):引起:java.lang.NullPointerException 09-11 19:13:04.590:E/AndroidRuntime(4235):在android.view.ViewConfiguration.get(ViewConfiguration.java:332)09-11 19:13:04.590:E/AndroidRuntime(4235):在android.view.View.(View.java: 3243)

Gru*_*Gru 5

你不必重写draw()方法View,无论你想做什么绘图,都要使用onDraw()方法.

public class DocumentCameraMask extends View {

        private Context mContext;

        public DocumentCameraMask(Context context) {
            super(context);

            this.mContext = context;
        }

        @Override
        public void onDraw(Canvas canvas) {
            // TODO Auto-generated method stub
            super.onDraw(canvas);
            Paint paint = new Paint();
            paint.setColor(this.mContext.getResources().getColor(R.color.textColor));
            paint.setStyle(Paint.Style.STROKE);

            Rect cropRect = new Rect(0,0,800,600);
            canvas.drawRect(cropRect, paint);             

        }

    }
Run Code Online (Sandbox Code Playgroud)

refernces:

1. 谷歌链接

2.另一个链接,这可能帮助你

更新:

我的主要活动:

public class MainActivity extends Activity {
DocumentCameraMask mask;
    RelativeLayout rel;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        rel = (RelativeLayout) findViewById(R.id.t);
mask = new DocumentCameraMask(this);

        mask.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.MATCH_PARENT));
        byte b = 100;
        int a = b;
        Toast.makeText(this,"Int "+a,Toast.LENGTH_LONG).show();

rel.addView(mask);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}
Run Code Online (Sandbox Code Playgroud)

自定义视图DocumentCameraMask类:

public class DocumentCameraMask extends View {

        private Context mContext;

        public DocumentCameraMask(Context context) {
            super(context);

            this.mContext = context;
        }

        @Override
        public void onDraw(Canvas canvas) {
            // TODO Auto-generated method stub
            super.onDraw(canvas);
            Paint paint = new Paint();
            paint.setColor(Color.BLUE);
            paint.setStyle(Paint.Style.STROKE);

            Rect cropRect = new Rect(0,0,800,600);
            canvas.drawRect(cropRect, paint);             

        }

    }
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述