Android开发中,经常会自定义View,那么就会使用构造方法,比如自定义MyView,继承View,会要求实现构造方法:

    public MyView(Context context) {
super(context);
     Log.v("MyView","MyView(Context context)");
} public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
     Log.v("MyView","MyView(Context context, AttributeSet attrs)");
} public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

那么,在真正使用的过程中,究竟是怎么调用呢?

在MainActivity的OnCreate中直接添加

MyView myView = new MyView(this);

打出的日志:

06-14 13:19:53.867  21160-21160/? V/MyView﹕ MyView(Context context)

这说明,第一个构造方法被调用

当我们在布局(XML)中添加

 <li.deng.com.test.view.MyView
android:layout_width="match_parent"
android:layout_height="wrap_content" />

注释掉 //MyView myView = new MyView(this);

打印Log:

06-14 13:25:07.196  22697-22697/? V/MyView﹕ MyView(Context context, AttributeSet attrs)

之前,每次看别人的代码都是这样子的:

 private Context mContext;
public MyView(Context context) {
super(context);
Log.v("MyView","MyView(Context context)");
this.mContext = context;
} public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
Log.v("MyView","MyView(Context context, AttributeSet attrs)");
this.mContext = context;
}

之前,还不是特别明白,为什么要写这么多构造方法,现在明白了构造方法的用法了,这是因为在开发的过程中,自己之定义了

 public MyView(Context context) {
super(context);
Log.v("MyView","MyView(Context context)");
this.mContext = context;
}
而在使用的过程中是在布局文件中定义View的时候,从而根本取不到上下文对象,结果就是空指针,后来查了一下构造方法相关的知识,必须要实现第二个构造方法
 public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
Log.v("MyView","MyView(Context context, AttributeSet attrs)");
this.mContext = context;
} 参考文章:http://825288003.iteye.com/blog/1595213
04-15 01:45