自定义View之构造方法
2019-02-25 本文已影响27人
NoBugException
在我们编写自定义view时第一件事总是编写构造方法,就以自定义Textview为例
public class CustomTextView extends AppCompatTextView {
public CustomTextView(Context context) {
super(context);
}
public CustomTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
}
我们写好它的构造方法,以上就是默认情况的写法了,我们加上初始化数据的代码
public class CustomTextView extends AppCompatTextView {
public CustomTextView(Context context) {
super(context);
init();
}
public CustomTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CustomTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
/**
* 初始化数据
*/
private void init(){
}
}
就目前情况,我们不清楚程序到底执行哪个构造方法,所以我们需要在每个构造方法里面都加上我们的初始化方法。
以上代码看起来比较繁琐,那么有没有什么办法优化呢?
首先我们需要了解自定义view的构造方法的执行时机
- 当使用xml初始化view时,默认调用
第二个构造方法
; - 其他构造方法基本都是用new关键字使用的;
了解构造方法的执行时机之后,开始思考用什么办法来简化代码?
我们可以使用层级的方式,也就是说,第一个构造方法调用第二个构造方法,第二个方法调用第三个构造方法,以次类推,最后一个构造方法依然调用父类的构造方法。
在这里需要掌握一个技巧,我们看一下父类的构造方法
图片.png我们发现父类的构造方法已经是层级调用了, 所以我们将代码拷贝到上层就可以了。
调整后的代码如下
public class CustomTextView extends AppCompatTextView {
public CustomTextView(Context context) {
this(context, null);
}
public CustomTextView(Context context, AttributeSet attrs) {
this(context, attrs, android.R.attr.textViewStyle);
}
public CustomTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
/**
* 初始化数据
*/
private void init(){
}
}
看到这里,有关层级调用的方法掌握了吗?
补充:
- this() ---- 调用当前类的构造方法
- super() ---- 调用父类的构造方法