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样式属性就显示不出来。