最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

第一種

每個(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.
  }
}

第二種

級聯(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.
  }
}

那么問題來了,我們該使用哪一種方式呢?

結(jié)論是:最好使用第一種,因?yàn)榈诙N方法在某些情況下會(huì)有問題,比如你自定義的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)致一系列問題。以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,使用第二種方法(級聯(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)生問題。

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

相關(guān)文章

最新評論

什邡市| 桑日县| 当雄县| 南丰县| 哈密市| 松阳县| 庆安县| 日照市| 和顺县| 湛江市| 神池县| 从化市| 长丰县| 威海市| 曲麻莱县| 东至县| 东源县| 遂川县| 翼城县| 墨江| 合水县| 凤山县| 承德县| 吴川市| 山阳县| 石门县| 桦川县| 东乌珠穆沁旗| 许昌市| 秭归县| 甘孜县| 沈阳市| 涟源市| 乌鲁木齐市| 伊春市| 石首市| 临安市| 呼和浩特市| 定日县| 射洪县| 塔城市|