一 、對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
</declare-styleable>
下面是錯誤的:
<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>
name="anr" />
</resources>
然後,
或者
<declare-styleable
<attr name="anr">
<enum name="none" value="0" />
這些都是錯誤的!
2:
<declare-styleable
name="theme">
name="colortext"
format="color|reference"/>
<attr name="colorforeground"
format="color"/>
name="colorforegroundinverse" format="color"/>
</declare-styleable>
這種方式定義屬性的前提是此前沒有對colortext,
colorforeground,colorforegroundinverse的任何定義。同第一種一樣,以後的<declare-styleable>塊内可以直接使用,但不能再做其他改動,e.g:
<attr name="colortext">
</declare-styleable>
或者:
<declare-styleable
<attr
name="colortext">
<attr name="colorforeground">
但下面是錯誤的:
<!--不能再有format="color|reference"說明-->
<attr name="colortext"
format="color|reference">
三、 如何使用平台自帶的屬性
name="fragmentarguments">
<!--不能有格式說明-->
name="android:label" />
此時,在r.styleable内部會有個屬性的定義,名為fragmentarguments_android_label。
但是,不能對平台自帶的屬性重新定義,e.g:
</resources>
但可以這樣:
name="label" format="string"/>
如何繼承style
可以使用點‘.’和“parent”來繼承自定義的style,而要想繼承平台style,則隻能使用“parent”。
四、 如何繼承style
1.
<style name="hellotheme"
parent="@android:style/theme.light"
>
<item
name="colorforeground">#770000</item>
<item
name="colorbackground">#000000</item>
name="colortext">#00ff00</item>
<item name="android:windowbackground" >@drawable/windowoverlay
</item>
name="android:windownotitle">false</item>
</style>
2.
<style
name="hellotheme"
parent="hellotheme.myhellotheme">
<item name="windowbackground" >@drawable/overlaybk
<item
</style>
<style name="hellotheme.hello"
<!--<item
name="android:background">?attr/windowbackground</item>-->
<!--<item
name="android:textcolor">?attr/colortext</item>-->
name="android:background">?windowbackground</item>
name="android:textcolor">?colortext</item>
3.
<style
name="holo">
name="textviewstyle">@style/hellotheme.hello</item>
4.
name="holo.textviewstyle" />
如果對一個textview使用holo.textviewstyle時,不會起到任何作用。應該直接使用:
<style
name="textviewstyle">
name="textviewstyle_1" parent="textviewstyle" >
<style name="textviewstyle.textviewstyle_1">
由此可知,屬性引用(reference)可以傳遞,當然前提是應用或活動的主題(theme)中使用了windowbackground和colortext,上例中:
等價于:
name="android:background">@drawable/overlaybk</item>
name="android:textcolor">#00ff00</item>
因為,windowbackground和colortext作為兩個屬性的引用,在這裡已被設定:
<style name="hellotheme"
自定義屬性時,在parent處指定的繼承平台已有屬性時偶爾會提示資源不存在
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 name="theme.iconmenu"
parent="theme.holo">
<!--
menu/item attributes -->
name="android:itemtextappearance">@android:style/textappearance.widget.iconmenu.item</item>
name="android:itembackground">?android:attr/selectableitembackground</item>
name="android:itemicondisabledalpha">?android:attr/disabledalpha</item>
name="android:horizontaldivider">@android:drawable/divider_horizontal_dark</item>
name="android:verticaldivider">@android:drawable/divider_vertical_dark</item>
name="android:windowanimationstyle">@android:style/animation.optionspanel</item>
name="android:moreicon">@android:drawable/ic_menu_more</item>
<item name="android:background">@null</item>
其中,<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。