看到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就能夠了。固然即便不用作換膚也徹底沒問題,這裏只是提供另外一個思路來寫佈局的屬性。