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


 

你可能感兴趣的:(android)