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