android - 使用 onDraw() 创建自定义 View 时出现 NullPointerException

标签 android view nullpointerexception

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

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);

    }

}

cropRect 大小将动态计算,这就是我需要创建此 View 的原因。 感谢您的帮助。

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: Unable to start activity 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): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2211) 09-11 19:13:04.590: E/AndroidRuntime(4235): at android.app.ActivityThread.access$600(ActivityThread.java:149) 09-11 19:13:04.590: E/AndroidRuntime(4235): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1300) 09-11 19:13:04.590: E/AndroidRuntime(4235): at android.os.Handler.dispatchMessage(Handler.java:99) 09-11 19:13:04.590: E/AndroidRuntime(4235): at android.os.Looper.loop(Looper.java:153) 09-11 19:13:04.590: E/AndroidRuntime(4235): at 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): Caused by: java.lang.NullPointerException 09-11 19:13:04.590: E/AndroidRuntime(4235): at android.view.ViewConfiguration.get(ViewConfiguration.java:332) 09-11 19:13:04.590: E/AndroidRuntime(4235): at android.view.View.(View.java:3243)

最佳答案

你不必覆盖 Viewdraw() 方法,无论你想做什么绘图,都可以使用 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);             

        }

    }

引用文献:

1. google link

2. 另一个link这可能对你有帮助

更新:

我的主要 Activity :

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;
    }

}

自定义 View 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);             

        }

    }

输出:

enter image description here

关于android - 使用 onDraw() 创建自定义 View 时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18744862/

相关文章:

android - 如何以编程方式隐藏/禁用 Android 软键盘上的表情符号

android - 枚举结果时出错,请检查原始异常以获取详细信息

asp.net-mvc-2 - 如何在 ASP.NET MVC 2 中使用 QueryString 返回 View ?

java - 无法通过空指针异常从索引 i-1 访问数组

java - 设置属性时出现 NullPointEException 错误

java - 将 Null-Object 拆箱为原始类型会导致 NullPointerException,好吗?

android - 检查设备 Chrome 自动重新打开/重新加载

android - 下载管理器 : notify when a download is finished

android - getView 的 DialogFragment 在 onDismiss 上返回 null

android - 什么是 Android View 的测量状态?