自定義View之構造方法

在我們編寫自定義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() ---- 調用父類的構造方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章