Android 自定义View之构造函数

146 阅读1分钟

Android自定义view的构造函数有两种写法:

1. super()

直接调用基类的构造函数,额外的初始化方法需要在每个构造函数里面都加上,不然你的初始化代码可能不会执行。

public ColorTrackTextView(@NonNull Context context) {
    super(context);
}

public ColorTrackTextView(@NonNull Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    initPaint(context, attrs);
}

public ColorTrackTextView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initPaint(context, attrs);
}

2.this() / init() - 级联式调用

用this()并加多一个参数作为构造函数,用最后一个构造函数调用基类的构造函数,并执行你需要的其它初始化工作。

public ColorTrackTextView(@NonNull Context context) {
    this(context, null);
    //super(context);
    //init(context, null, 0); //第二种方式
}

    public ColorTrackTextView(@NonNull Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ColorTrackTextView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        initPaint(context, attrs);
    }

那使用哪种构造函数的方式更好呢? 答案是第一种,因为级联式构造方法有可能会覆盖掉父类的默认属性,比如在TextView的构造函数中:

public TextView(Context context) {
    this(context, null);
}

public TextView(Context context, @Nullable AttributeSet attrs) {
    this(context, attrs, com.android.internal.R.attr.textViewStyle);
}

public TextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    this(context, attrs, defStyleAttr, 0);
}

如果没有调用super(context),那么默认的R.attr.textViewStyle样式属性就显示不出来。