看到style,很多人可能会说这个我知道,就是控件写属性的话能够经过style来实现代码的复用,单独把这些属性及其参数写成style就能够便捷的调用。
html
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CustomText" parent="@style/Text">
<item name="android:textSize">20sp</item>
<item name="android:textColor">#008</item>
</style>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<EditText
style="@style/CustomText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello, World!" />
这种写法呢其实比较常见,若是有某些控件用到了相同的风格,就能够用style来做,今天要讲的不是这种写法,下面先看一下案例android
<EditText id="text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="?android:textColorSecondary"
android:text="@string/hello_world" />
请注意其中的 android:textColor="?android:textColorSecondary" ,这里给的是一个reference,并且是系统的资源。官网上有写介绍http://developer.android.com/guide/topics/resources/accessing-resources.htmlapp
这种写法叫作“Referencing style attributes”即引用风格属性,那么怎么引用自定义的东西呢,是首先须要定义attributes,这和自定义控件时写的style声明是同样的,遵守下面的格式定义一个activatableItemBackground的属性,值得类型是reference引用类型,ide
<resources>布局
<declare-styleable name="TestTheme">ui
<attr name="activatableItemBackground" format="reference"></attr>spa
</declare-styleable>orm
</resources>xml
接着定义咱们的theme,而且把这个属性用上去,theme实际上也是style,只是针对Application和Activity时的不一样说法而已。htm
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="activatableItemBackground">@drawable/item_background</item>
</style>
</resources>
theme写好后咱们把它应用到application或者某个activity,
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.avenwu.sectionlist.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
这些准备工做完成后,恭喜你如今能够用 ?[<package_name>:][<resource_type>/]<resource_name>的方式来写布局了,注意开头是?不是@。
<TextView
android:layout_width="match_parent"
android:layout_height="50dp"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Large Text"
android:id="@+id/textView"
android:gravity="center"
android:background="?activatableItemBackground"
android:clickable="true"
android:layout_gravity="left|top"/>
这个TextView用两个?,一个引用系统资源,background则用了咱们刚刚准备的资源。
最后咱们来说一下,为何用这种方式,实际上这种写法主要是剥离了具体的属性值,比如咱们的background,如今对应的值不是一个肯定的值,它依赖于theme里面的具体赋值,这样的话若是须要更换主题风格咱们就不须要针对每一个布局改来改去,只要从新写一个对应不一样资源的theme就能够了。固然即便不用作换肤也彻底没问题,这里只是提供另外一个思路来写布局的属性。