7

假設我正在創造一些新風格的屬性。我宣佈他們正是如此(這是how the documentation says to do it聲明樣式的要點是什麼?

<?xml version="1.0" encoding="utf-8"?> 
<resources> 

    <declare-styleable name="TriangleView"> 
     <attr name="direction"> 
      <enum name="NE" value="0" /> 
      <enum name="NW" value="1" /> 
      <enum name="SW" value="2" /> 
      <enum name="SE" value="3" /> 
     </attr> 
    </declare-styleable> 

    <declare-styleable name="BannerView"> 
     <attr name="direction"> 
      <enum name="NE" value="0" /> 
      <enum name="NW" value="1" /> 
      <enum name="SW" value="2" /> 
      <enum name="SE" value="3" /> 
     </attr> 
     <attr name="thickness" format="dimension" /> 
    </declare-styleable> 
</resources> 

但是,這不會工作,因爲所有的屬性顯然是在同一個命名空間,我得到的錯誤Error: Attribute "direction" has already been defined

因此很明顯,我必須移動。在<declare-styleable>這樣的外部顯然複製屬性:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 


    <attr name="direction"> 
     <enum name="NE" value="0" /> 
     <enum name="NW" value="1" /> 
     <enum name="SW" value="2" /> 
     <enum name="SE" value="3" /> 
    </attr> 

    <declare-styleable name="BannerView"> 
     <attr name="thickness" format="dimension" /> 
    </declare-styleable> 
</resources> 

但是這會帶來兩個問題:

  1. 如果這能起作用,<declare-styleable>的含義是什麼?
  2. 如果我希望屬性在不同視圖中表現不同,該怎麼辦?例如,如果BannerView的方向只能是updown

回答

15

<declare-styleable>究竟是什麼意思?

<declare-stylable>標籤讓你聲明你的自定義視圖的屬性,然後你可以在XML中設置這些視圖。實際上有3個部分使用屬性:

  1. 聲明一個<attr>一個<declare-stylable>標籤內。
  2. 在xml佈局中定義一個指向您的應用程序包名稱的自定義名稱空間(例如,app)。在佈局中使用自定義屬性(例如,app:direction="NW")。
  3. 在您的自定義視圖中,用AttributeSet參數覆蓋構造函數,獲取TypedArray並從中讀取自定義屬性(如果有),然後在構造函數中告訴視圖如何正確使用這些屬性。

如果我希望該屬性在不同視圖中的行爲不同,該怎麼辦? 例如,如果BannerView的方向只能向上或向下。

嘗試這樣:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 

    <attr name="direction"> 
     <enum name="NE" value="0" /> 
     <enum name="NW" value="1" /> 
     <enum name="SW" value="2" /> 
     <enum name="SE" value="3" /> 
    </attr> 

    <declare-styleable name="TriangleView"> 
     <attr name="direction" /> 
    </declare-styleable> 

    <declare-styleable name="BannerView"> 
     <attr name="direction" /> 
     <attr name="thickness" format="dimension" /> 
    </declare-styleable> 
</resources> 

當你建立TriangleViewBannerView你的XML佈局,您可以使用這兩個app:direction="NW"例子。在TriangleViewBannerViewAttributeSet構造函數,屬性將具有相同的格式與原始,但你與價值取決於您的實現在每個相應的視圖構造器(可以是相同或兩者不同)。

如果你想屬性被定義 differenly(即。不同的「格式」或「枚舉」)不同的視圖,那麼你必須創建具有不同名稱的不同屬性。

+0

真棒,實際上幫助我以及在應用程序庫中定義的attr!所以基本上,如果已經定義了attr,它應該用在declare-styleable中,而不要試圖覆蓋格式。酷酷酷。 – Redwarp