風格和主題(Styles and Themes)
風格就是用來指定view或者window的外貌和格式的一系列的屬性的集合,包括高度,間隙,字體大小,顏色,背景顏色等。風格是通過XML資源定義,它跟知道layout的XML文件不同。
Android 風格跟網頁設計一樣,允許將內容跟設計分離。
例如要設計下面這個TextView,XML layout 定義如下:
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#00FF00"
android:typeface="monospace"
android:text="@string/hello" />
style 設計模式如下:
<TextView
style="@style/CodeFont"
android:text="@string/hello" />
所有跟風格相關的屬性都從XML layout移到了了一個叫做CodeFont的style中,具體定義後面會介紹。
主題也是一種風格,不過它是被應用到整個的活動或者應用中,而不是應用到一個單獨的view。當一個風格被應用爲一個主題時,這個活動或者應用中的所有view 都會採用它所支持的style的所有屬性。
定義一個風格
1. 在APP的 /res/values/ 目錄下面建立一個XML文件,文件名隨意取定,但是文件後綴名必須是.xml.例如style.xml
2. style.xml 文件的根節點必須是 <resources>
3. 每個<style>元素對於一個風格,對於這個元素,它的name 屬性是用來識別它的唯一標誌
4. 對於一個風格的每個屬性,都需要添加一個<item>元素,<item>元素包含一個屬性名和一個屬性值
例子如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<stylename="CodeFont"parent="@android:style/TextAppearance.Medium">
<itemname="android:layout_width">fill_parent</item>
<itemname="android:layout_height">wrap_content</item>
<itemname="android:textColor">#00FF00</item>
<itemname="android:typeface">monospace</item>
</style>
</resources>
<resources>元素的每個子元素在編譯的時候就會轉換成一個應用資源對象,然後通過它的name的值就能引用它了。
<style>元素的parent 屬性是可選的。它通過資源ID指定了該style應該從其它style繼承得到的屬性,同時你也可以複寫這些屬性。
一個style,無論是用作主題還是風格,它們都是定義在XML文件中的。
繼承
<style>元素的繼承屬性允許你的style繼承來自其它style定義的屬性(包括自己另外定義的或者系統本省提供的)。然後你只需要添加一些額外的屬性即可。同時你也能複寫繼承得到的屬性來改變它本身的值。例如繼承自系統的style:
<style name="GreenText" parent="@android:style/TextAppearance">
<item name="android:textColor">#00FF00</item>
</style>
如果你需要繼承你自己的style,不一定非要parent屬性。你只需要將你要繼承的style名字作爲新style的前綴,並用點隔開即可。例如繼承自CodeFont 的style Red定義如下:
<style name="CodeFont.Red">
<item name="android:textColor">#FF0000</item>
</style>
引用方法:@style/CodeFont.Red
.
這種通過前綴名和.的繼承方式可以無限制的繼承下去,例如:
<style name="CodeFont.Red.Big">
<item name="android:textSize">30sp</item>
</style>
注意:這種繼承方式只能用於你自己定義的style.要想繼承系統的style,必須使用parent屬性。
風格的屬性
既然已經知道如何定義一個風格,那麼我們有必要了解下風格里面的<item>元素可以定義哪些屬性。
對於一個view而言,要定義它的<item>屬性,最好的辦法就是去這個view的參考類中去找,這個參考類會列出所有支持的XML屬性。這些屬性以及它父類的屬性都能夠被定義在style 中。
例子:
<EditText
android:inputType="number"
... />
You can instead create a style for the EditText
element that includes this property:
<stylename="Numbers">
<itemname="android:inputType">number</item>
...
</style>
So your XML for the layout can now implement this style:
<EditText
style="@style/Numbers"
... />
這種工作看上行去更復雜,實際上當你有大量的屬性要設置的時候,這種做法是很值得推薦的。
此外,在R.attr 中,你能夠找到所有的style 屬性。值得一提的是,如果你將一個style應用到一個view中,但是某些屬性這個view不支持,就會直接忽視,將支持的應用起來。
對於某些屬性不能被任何view支持,只能應用爲主題。這些屬性是應用到一個窗口的。而不是任何一個view.例如隱藏應用的標題,狀態欄,改變窗口的背景顏色等(更多請看:R.attr 中 window.開頭的屬性)。
注意:<item>的格式:<item name="android:inputType">
.
將風格和主題應用到UI
在R.style 類中有大量的style供你使用。爲了更好的理解style.請參照這些style的源碼。