標籤:android style tar ext color get
一 、對style和attr的引用
1. 當引用平台的style做為style的parent時,“@android:style/主題” == “@android:主題” ==“ android:style/主題 ”== “android:主題”;
2. 當引用平台的style作為屬性的引用時,“@android:style/主題”;
3. 當引用自訂style作為其他style的parent時,“@style/主題” == “style/主題” == “主題”;
4. 當引用自訂style作為其他屬性的引用時,“@style/主題”;
5. 當引用平台屬性作為屬性的引用時,“?android:attr/屬性” == “?android:屬性”;
6. 當引用自訂屬性時,“?attr/屬性” == “?屬性”;
7. 上述六個情況中,可以在‘@‘或‘?‘後加入‘*‘以引用被隱藏(即平台私人)的資源;
8. 如果引用平台資源或屬性時,可以將“android:”放在斜杠“/”的後面,即,@android:style/主題”== @style/android:主題”,“?android:attr/屬性”== “?attr/android:屬性”;
二、 如何自訂屬性
1:
<resources>
<attr name="anr">
<enum name="none" value="0" />
<enum name="thumbnail" value="1" />
<enum name="drop" value="2" />
</attr>
</resources>
這種方式定義屬性後,其他的<declare-styleable>塊內可以直接使用,但不能帶有任何名字或格式說明,e.g:
<declare-styleable name="TextView">
<attr name="anr">
</declare-styleable>
下面是錯誤的:
<declare-styleable name="TextView">
<attr name="anr" format="string">
</declare-styleable>
因為這相當於重新定義了"anr",這是不允許的。因此,<declare-styleable>塊外出現的屬性優先於<declare-styleable>塊內出現的屬性,即,如果<declare-styleable>塊內出現某一帶有format描述的屬性,而<declare-styleable>塊外也有一個同名屬性(沒有format說明),則是錯誤的。
此外,如果對首次出現在<declare-styleable>內的屬性指定了format,則其他的<declare-styleable>內可直接使用這個屬性,但不能再指定其他format。這種情況類似於使用首次出現<declare-styleable>塊外的屬性。
因此,在<declare-styleable>塊外的屬性最好都指明format說明,以便為<declare-styleable>塊內使用。
e.g:
如果,
<resources>
<attr name="anr" />
</resources>
然後,
或者
<declare-styleable name="TextView">
<attr name="anr">
<enum name="none" value="0" />
<enum name="thumbnail" value="1" />
<enum name="drop" value="2" />
</attr>
</declare-styleable>
這些都是錯誤的!
2:
<declare-styleable name="Theme">
<attr name="colorText" format="color|reference"/>
<attr name="colorForeground" format="color"/>
<attr name="colorForegroundInverse" format="color"/>
</declare-styleable>
這種方式定義屬性的前提是此前沒有對colorText, colorForeground,colorForegroundInverse的任何定義。同第一種一樣,以後的<declare-styleable>塊內可以直接使用,但不能再做其他改動,e.g:
<declare-styleable name="TextView">
<attr name="colorText">
</declare-styleable>
或者:
<declare-styleable name="TextView">
<attr name="colorText">
<attr name="colorForeground">
</declare-styleable>
但下面是錯誤的:
<declare-styleable name="TextView">
<!--不能再有format="color|reference"說明-->
<attr name="colorText" format="color|reference">
<attr name="colorForeground">
</declare-styleable>
三、 如何使用平台內建的屬性
e.g:
<declare-styleable name="FragmentArguments">
<!--不能有格式說明-->
<attr name="android:label" />
</declare-styleable>
此時,在R.styleable內部會有個屬性的定義,名為FragmentArguments_android_label。
但是,不能對平台內建的屬性重新定義,e.g:
<resources>
<attr name="android:label" />
</resources>
但可以這樣:
<resources>
<attr name="label" format="string"/>
</resources>
如何繼承style
可以使用點‘.’和“parent”來繼承自訂的style,而要想繼承平台style,則只能使用“parent”。
四、 如何繼承style
可以使用點‘.’和“parent”來繼承自訂的style,而要想繼承平台style,則只能使用“parent”。
e.g:
1.
<style name="HelloTheme" parent="@android:style/Theme.Light" >
<item name="colorForeground">#770000</item>
<item name="colorBackground">#000000</item>
<item name="colorText">#00ff00</item>
<item name="android:windowBackground" >@drawable/windowoverlay </item>
<item name="android:windowNoTitle">false</item>
</style>
2.
<style name="HelloTheme" parent="HelloTheme.MyHelloTheme">
<item name="windowBackground" >@drawable/overlaybk </item>
<item name="colorText">#00ff00</item>
</style>
<style name="HelloTheme.Hello" >
<!--<item name="android:background">?attr/windowBackground</item>-->
<!--<item name="android:textColor">?attr/colorText</item>-->
<item name="android:background">?windowBackground</item>
<item name="android:textColor">?colorText</item>
</style>
3.
<style name="Holo">
<item name="textViewStyle">@style/HelloTheme.Hello</item>
</style>
4.
<style name="Holo.TextViewStyle" />
如果對一個TextView使用Holo.TextViewStyle時,不會起到任何作用。應該直接使用:
<style name="TextViewStyle">
<item name="android:background">?windowBackground</item>
<item name="android:textColor">?colorText</item>
</style>
或者
<style name="TextViewStyle_1" parent="TextViewStyle" >
或者
<style name="TextViewStyle.TextViewStyle_1">
由此可知,屬性引用(reference)可以傳遞,當然前提是應用或活動的主題(theme)中使用了windowBackground和colorText,上例中:
<item name="android:background">?windowBackground</item>
<item name="android:textColor">?colorText</item>
等價於:
<item name="android:background">@drawable/overlaybk</item>
<item name="android:textColor">#00ff00</item>
因為,windowBackground和colorText作為兩個屬性的引用,在這裡已被設定:
<style name="HelloTheme" parent="HelloTheme.MyHelloTheme">
<item name="windowBackground" >@drawable/overlaybk </item>
<item name="colorText">#00ff00</item>
</style>
自訂屬性時,在parent處指定的繼承平台已有屬性時偶爾會提示資源不存在
e.g:
parent="@android:style/TextAppearance.Holo.Light.Inverse"
error: Error retrieving parent for item: No resource found that matches the given name ‘@android:style/TextAppearance.Holo.Light.Inverser‘.
這種寫法是錯誤的,雖然平台下的data/res/styles.xml內有該屬性的定義,但是平台的android.R.style類內並不存在TextAppearance_Holo_Light_Inverse,因為此類屬性是平台的私人屬性,不公開的。所以,也不能使用android.R.style.TextAppearance_Holo_Light_Inverse.
若要避免錯誤,可以這樣書寫:parent="@*android:style/TextAppearance.Holo.Light.Inverse" ,或去掉‘@‘和(或)‘style/‘。
最後,如果style的名字內既出現了點‘.’,也使用“parent”,則該style只繼承了parent指向的style,style的 "name"裡的‘.’不會起作用。如果在style的"name"內出現了‘.’,而又沒有使用"parent",則name裡的點‘.‘之前的名字必須存在定義。而如果使用了parent,name內點‘.‘之前的任何名字可以不存在定義。
五、 “android:”前出現‘@’和‘?’的區別
在定義style時經常會遇到此類情況,例如:
在定義style時經常會遇到此類情況,例如:
<style name="Theme.IconMenu" parent="Theme.Holo">
<!-- Menu/item attributes -->
<item name="android:itemTextAppearance">@android:style/TextAppearance.Widget.IconMenu.Item</item>
<item name="android:itemBackground">?android:attr/selectableItemBackground</item>
<item name="android:itemIconDisabledAlpha">?android:attr/disabledAlpha</item>
<item name="android:horizontalDivider">@android:drawable/divider_horizontal_dark</item>
<item name="android:verticalDivider">@android:drawable/divider_vertical_dark</item>
<item name="android:windowAnimationStyle">@android:style/Animation.OptionsPanel</item>
<item name="android:moreIcon">@android:drawable/ic_menu_more</item>
<item name="android:background">@null</item>
</style>
其中,<item name="android:itemTextAppearance">@android:style/TextAppearance.Widget.IconMenu.Item</item>表明"android:itemTextAppearance"為一個style類型,它引用了平台的另一個style(TextAppearance.Widget.IconMenu.Item)。而 <item name="android:itemIconDisabledAlpha">?android:attr/disabledAlpha</item>則表明"android:itemIconDisabledAlpha"的屬性值引用當前主題下的disabledAlpha。