View在5.0以上,有四个构造函数(分别带1 2 3 4个参数)
1、第二个内部调用第三个,第三个又调用第四个,最后第四个内部又调用第一个,形成了一个链
2、而View的子类四个函数调用关系:第一个调用第二个,第二个调用第三个,第三个调用第四个,而第四个则调用父类的第四个构造函数super(context, attrs, defStyleAttr, defStyleRes);
3、例如ViewGroup: 第一个调用第二个,第二个调用第三个,第三个调用第四个,而第四个则调用View的第四个,View的第四个内部则调用了View的第一个
View:
public View(Context context) {
....
}
public View(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
this(context);
....
}
而ViewGroup:
publicViewGroup(Context context) {
this(context, null);
}
publicViewGroup(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
publicViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
publicViewGroup(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initViewGroup();
initFromAttributes(context, attrs, defStyleAttr, defStyleRes);
}
说白点,这是Android逐渐新增功能对低版本兼容的方式。
比如四个参数的构造方法的最后那个参数,是最近才加入的,为了保证低版本兼容,原来三个参数的构造方法还需要保留,这时候就直接让三参数的构造方法带上一个第四参数的默认值调用第四参数,就可以避免写很多重复的代码了。