2011-11-13 36 views
19

我有我的自定義視圖從View延長。有3層視圖的構造函數:哪個構造函數被調用來查看?

  1. View(Context context, AttributeSet attrs, int defStyle)
  2. View(Context context, AttributeSet attrs)
  3. View(Context context)

從我的活動我打電話std.setContentView(R.layout.main)。第二個構造函數在我看來被調用。爲什麼是第二個?如何預先知道哪一個將被調用,爲什麼?

回答

41

從下文檔的Android開發者網站查看:

public View (Context context)

簡單的構造函數創建從代碼視圖時使用。

所以這個構造函數是你可以用來在Java中創建一個View。從XML膨脹時不會調用它。

public View (Context context, AttributeSet attrs)

構造充氣從XML的視圖時調用。這是在從XML文件構造視圖時調用的,並提供在XML文件中指定的屬性。此版本使用默認樣式0,所以應用的唯一屬性值是Context's Theme和給定AttributeSet中的值。

的方法onFinishInflate()將所有的孩子都被加入後調用。

因此,當您不指定樣式時,從XML擴展視圖時將調用此構造函數。

public View (Context context, AttributeSet attrs, int defStyle)

從XML執行通貨膨脹和應用類特定的基本樣式。 View的這個構造函數允許子類在膨脹時使用他們自己的基礎樣式。例如,一個Button類的構造函數會叫這個版本的超級類的構造函數和供應R.attr.buttonStyle爲defStyle的;這允許主題的按鈕樣式修改所有基本視圖屬性(尤其是它的背景)以及Button類的屬性。

你應該實現所有這些構造的,但你可以分別把所有的第三個工作致電this(context, null)this(context, attrs, 0)爲第2位。

+2

超級(上下文,attrs)和超級(上下文,attrs,0)爲我工作差異。首先一個是好的,但是從第二視刪除原有的風格,所以我不能用這個(背景下,ATTRS,0)。這是Android的新版本中的錯誤嗎? – broot

+1

請不要級聯構造函數調用,請參閱下面的答案。 – Jin

+0

我想這是金的回答是:http://stackoverflow.com/a/34301725/326874 – aeracode

相關問題