天天看點

android style和attr的用法

一  、對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。