2014-12-28 65 views
9

我開始了一個針對Android Lollipop(21)的項目,並創建了一個自定義視圖。當我爲視圖生成構造函數時,我得到了一個新的第四個構造函數,它比其他構造函數更多的參數。爲什麼我們需要第四個構造函數用於棒棒糖?

public class FooView extends FrameLayout { 
    public FooView(Context context) { 
    super(context); 
    } 

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

    public FooView(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    } 

    // This 4th constructor 
    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    public FooView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
    super(context, attrs, defStyleAttr, defStyleRes); 
    } 
} 

我的問題是,我們爲什麼需要它?如果我刪除此構造函數並在棒棒糖上運行應用程序,會發生什麼情況?

+0

看到https://stackoverflow.com/questions/9195713/do-i-need-all-three-constructors-for-an-android-custom-view –

+0

你不需要它並沒有什麼將會發生,如果你刪除它(見前面的評論)。它存在於默認視圖中,以便您可以傳入默認樣式資源(請參閱下面的answer re:docs)。 – alanv

+0

爲什麼有人想這樣做? – mbonnin

回答

2

信息從official doc

公共視圖(上下文的背景下,AttributeSet中的ATTRS,INT defStyleAttr, INT defStyleRes)

在API級別21

從XML執行通貨膨脹和應用類 - 來自 的特定基礎樣式是主題屬性或樣式資源。 View的構造函數允許 子類在膨脹時使用它們自己的基礎樣式。

當確定特定屬性的最終值,存在 四個輸入即來發揮作用:

  1. 在給定的AttributeSet的任何屬性值。
  2. 在AttributeSet(名爲「style」)中指定的樣式資源。
  3. defStyleAttr指定的默認樣式。
  4. defStyleRes指定的默認樣式。
  5. 此主題中的基本值。

這些輸入中的每一個都按順序考慮,其中第一個列出的 優先於以下列出的輸入。換句話說,如果在 屬性集中你已經提供了,那麼 這個按鈕的文本將始終是黑色的,而不管在任何樣式中指定的是 。

參數

  • 上下文視圖運行中,上下文,通過它可以訪問當前主題,資源等
  • ATTRS被充氣視圖的XML標籤的屬性。
  • defStyleAttr當前主題中的一個屬性,其中包含對爲 視圖提供默認值的樣式資源的引用。可以爲0以不尋找默認值。
  • defStyleRes爲視圖提供默認值的樣式資源的資源標識符,僅在defStyleAttr爲0或在主題中找不到 時使用。可以爲0以不尋找默認值。