在我們編寫自定義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關鍵字使用的;
瞭解構造方法的執行時機之後,開始思考用什麼辦法來簡化代碼?
我們可以使用層級的方式,也就是說,第一個構造方法調用第二個構造方法,第二個方法調用第三個構造方法,以次類推,最後一個構造方法依然調用父類的構造方法。
在這裏需要掌握一個技巧,我們看一下父類的構造方法
我們發現父類的構造方法已經是層級調用了, 所以我們將代碼拷貝到上層就可以了。
調整後的代碼如下
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() ---- 調用父類的構造方法