欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android 自定義View的構(gòu)造函數(shù)詳細(xì)介紹

 更新時(shí)間:2016年12月21日 14:45:57   投稿:lqh  
這篇文章主要介紹了Android 自定義View的構(gòu)造函數(shù)詳細(xì)介紹的相關(guān)資料,這里對(duì)構(gòu)造函數(shù)進(jìn)行了對(duì)比按需使用,需要的朋友可以參考下

 Android自定義View的構(gòu)造函數(shù)

自定義View是Android中一個(gè)常見(jiàn)的需求,每個(gè)自定義的View都需要實(shí)現(xiàn)三個(gè)基本的構(gòu)造函數(shù),而這三個(gè)構(gòu)造函數(shù)又有兩種常見(jiàn)的寫法。

第一種

每個(gè)構(gòu)造函數(shù)分別調(diào)用基類的構(gòu)造函數(shù),再調(diào)用一個(gè)公共的初始化方法做額外初始化。

public class MyView extends ListView {
  public MyView(Context context) {
    super(context);
    sharedConstructor();
  }

  public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);
    sharedConstructor();
  }

  public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    sharedConstructor();
  }
  
  private void sharedConstructor() {
    // Do some initialize work.
  }
}

第二種

級(jí)聯(lián)式調(diào)用,每一個(gè)構(gòu)造函數(shù)調(diào)用比它多一個(gè)參數(shù)的構(gòu)造函數(shù),最后一個(gè)構(gòu)造函數(shù)調(diào)用基類的構(gòu)造函數(shù),最后在做一些額外的初始化工作。

public class MyView extends ListView {
  public MyView(Context context) {
    this(context, null);
  }

  public MyView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }

  public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    
    // Other initialize work.
  }
}

那么問(wèn)題來(lái)了,我們?cè)撌褂媚囊环N方式呢?

結(jié)論是:最好使用第一種,因?yàn)榈诙N方法在某些情況下會(huì)有問(wèn)題,比如你自定義的View繼承自ListView或者TextView的時(shí)候,ListView或者TextView內(nèi)部的構(gòu)造函數(shù)會(huì)有一個(gè)默認(rèn)的defStyle, 第二種方法調(diào)用時(shí)defStyle會(huì)傳入0,這將覆蓋基類中默認(rèn)的defStyle,進(jìn)而導(dǎo)致一系列問(wèn)題。以ListView為例,看看它的構(gòu)造函數(shù)。

public ListView(Context context) {
    this(context, null);
  }

  public ListView(Context context, AttributeSet attrs) {
    this(context, attrs, com.android.internal.R.attr.listViewStyle);
  }

  public ListView(Context context, AttributeSet attrs, int defStyleAttr) {
    this(context, attrs, defStyleAttr, 0);
  }

  public ListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    // Other works.
  }

可以看到ListView的第二個(gè)構(gòu)造函數(shù)代碼中傳入了一個(gè)com.android.internal.R.attr.listViewStyle,使用第二種方法(級(jí)聯(lián)式)調(diào)用時(shí),我們傳入的是0,將會(huì)覆蓋這個(gè)默認(rèn)值。但是第一種方法中調(diào)用了super(context, attrs); 進(jìn)而調(diào)用了基類的 this(context, attrs, com.android.internal.R.attr.listViewStyle);就不會(huì)產(chǎn)生問(wèn)題。

 感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

最新評(píng)論