我正在创建一个我添加到 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)
最佳答案
你不必覆盖 View
的 draw()
方法,无论你想做什么绘图,都可以使用 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);
}
}
输出:
关于android - 使用 onDraw() 创建自定义 View 时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18744862/