天天看点

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。