Android自定义View 构造方法 遇到的一些问题

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


 

posted @ 2015-06-14 13:44  zzxd  阅读(548)  评论(0编辑  收藏  举报