最新国产好看的视频,伊人天堂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)資料,這里對(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)的寫(xiě)法。

第一種

每個(gè)構(gòu)造函數(shù)分別調(diào)用基類(lèi)的構(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)用基類(lèi)的構(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,這將覆蓋基類(lèi)中默認(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)用了基類(lèi)的 this(context, attrs, com.android.internal.R.attr.listViewStyle);就不會(huì)產(chǎn)生問(wèn)題。

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

相關(guān)文章

最新評(píng)論

固原市| 汉中市| 绥芬河市| 盈江县| 湟中县| 宽甸| 乌兰县| 阿拉善左旗| 邢台县| 金塔县| 中西区| 武威市| 区。| 古丈县| 淮滨县| 许昌县| 襄垣县| 井陉县| 大化| 湛江市| 西乌珠穆沁旗| 泰和县| 洪洞县| 思南县| 清徐县| 江口县| 铜陵市| 前郭尔| 宿迁市| 新郑市| 清镇市| 新竹县| 延吉市| 积石山| 赤城县| 勃利县| 东至县| 龙里县| 浑源县| 宁蒗| 平定县|