Android的Style和Theme 譯文

轉載請註明出處:http://blog.csdn.net/asdzheng/article/details/42838279

本文來源於Android Doc,英文好的也可以直接看原文,原文地址:http://developer.android.com/guide/topics/ui/themes.html

如有發現翻譯錯誤,請留言指出,謝謝。另外,本文的鏈接大部分Android Doc在國內的鏡像,不用翻牆也能訪問。


樣式與佈局


Style 是Window和View的外觀和格式的屬性集合。它可以作爲高度,間距,字體大小,背景顏色等屬性。Style是一種 xml 資源文件,放在和佈局文件不同的文件夾裏;

Style 的設計理念和 Web一脈相承——即它們都允許你把內容和樣式分離。

例如,你用Style可以把下面這個xml文件:

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textColor="#00FF00"
    android:typeface="monospace"
    android:text="@string/hello" />
替換成下面這種形式:

<TextView
    style="@style/CodeFont"
    android:text="@string/hello" />
看上面的例子,佈局裏的全部屬性都放到一個名爲CodeFont的Style裏,這裏的CodeFont就是一個Style。你在接下來的內容裏會看到這個佈局是怎麼被定義的。

你可以把Theme當成是整個Activity或者整個程序的樣式(Style),它的覆蓋範圍比上面例子裏那個view的範圍更大。當一個Style被當成一個Theme時,Activity或整個程序裏的每一個View都會用到同樣style屬性,如果那些屬性它們支持的話。舉個例子,你可以把一個Activity的樣式設置成上面CodeFont,這樣的話Activity裏面的所有字體就都會成綠色的“monospace”了。

定義Style


在你項目裏的res/values/路徑下生成一個xml文件,然後在裏面創建出一組style。這個XML文件名你可以任意的取,只要它以.xml爲後綴並保存在res/values/路徑下就行。

樣式文件必須以<resources>爲根節點。

你每要創建一個style,都要在<style>的標籤裏新建唯一名稱name(name是必須的)。然後在style裏增加一個帶有name和value的<item>標籤(name和value也是必須的)。<item>裏的value值可以是一個字符串,一個十六進制的顏色值,一個資源引用,或者其他style可以用到的屬性值。下面是單個style的樣式例子:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="CodeFont" parent="@android:style/TextAppearance.Medium">
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textColor">#00FF00</item>
        <item name="android:typeface">monospace</item>
    </style>
</resources>
<resources>下的每個元素都會在編譯被期間被轉成程序的資源類,以<style>的命名生成值引用。這個例子裏的style可以被佈局文件用@style/CodeFont引用。(像文章開頭那樣)

在<style>裏還有一個parent屬性,這個屬性是可選的,你可以在這個屬性裏指定另一個資源ID來作爲你想要繼承的style。然後可以複寫繼承而來的屬性。

請注意,把style作爲Activity或整個程序的主題也是像把style作爲一個View的樣式那樣在xml文件裏那樣定義。像上面例子裏的style可以應用在單個視圖View裏或作爲Activity和整個程序的主題。至於怎樣把一個style應用到單個View裏或作爲一個程序的主題,稍候會提到。

繼承


在<style>元素裏,parent這個屬性可以讓你定義一個style去繼承其他已存在的style,然後只增加或者複寫那些你需要的屬性。已存在的style包括你自己創建的和系統本身帶有的(系用自帶的style和theme,這個鏈接有Android平臺自帶的style和theme)。例如,你可以繼承Android平臺下面默認的text appenrence 樣式然後修改它:
 <style name="GreenText" parent="@android:style/TextAppearance">
        <item name="android:textColor">#00FF00</item>
 </style>
如果你想要繼承那些你自己定義的style,你不一定需要用到parent這個屬性。你可以用另一種方式來代替,把你想要繼承的那個style作爲前綴,用一點與你想要新建的style分隔開來。例如,創建一個繼承自上面例子裏的CodeFont 樣式,但把顏色改成紅的,你可以像下面這樣創建一個新的style:
<style name="CodeFont.Red">
        <item name="android:textColor">#FF0000</item>
</style>
在看上面的例子裏,在style裏並沒有parent屬性,只是在name屬性裏把CodeFont作爲前綴放在Red的前面,這樣也能繼承CodeFont裏面的所有屬性。這個style複寫了textColor屬性,將字體顏色變成紅的。這樣定義以後,你就可以用@style/CodeFont.Red 這種方式來引用這個新的style了。

你還可以像這樣的格式繼續繼承無數次,例如,你可以繼續擴展CodeFont.Red,像下面這樣:
    <style name="CodeFont.Red.Big">
        <item name="android:textSize">30sp</item>
    </style>
上面這種寫法的style就是繼承自CodeFont 和 CodeFont.Red,然後加上android:textSize 屬性。

請注意:這種繼承寫法,只能用在你自己定義的style樣式裏,你可不能把它運用到Android平臺自帶的style樣式上。對於像TextAppearance這種Android平臺自帶的樣式,你只能乖乖的用parent屬性來繼承。 

樣式屬性


現在你知道怎麼定義一個style了,接下來你得知道<item>標籤裏有哪些屬性是可以用的了。你可能對一些屬性很熟悉了,例如layout_width和textColor。當然,除了這些還有好多屬性你可以用。

找到這些屬性最好的地方是View的相應類的文檔,那裏列出xml裏支持的所有屬性。例如,所有TextView可以用到的樣式屬性都羅列在TextView XML attributes這張表裏。還有一些是列有某種屬性值的表,例如這張android:inputType,你可以將裏面的屬性值作爲<EditText>的一個屬性,像下面的例子:
<EditText
    android:inputType="number"
    ... />
你也可以創建一個style作爲EditText的屬性替代上面那種方式:
<style name="Numbers">
  <item name="android:inputType">number</item>
  ...
</style>
這樣你的EditText就可以用這個style了:
<EditText
    style="@style/Numbers"
    ... />
這個簡單的例子可能會讓你覺得用了style反而更麻煩,其實未必,當在一個真實的項目裏,你把很多需要複用到的屬性寫到一個style裏,供所有用到的那些屬性的地方使用,那時你就會覺得節省裏很多麻煩。

style的所有可用屬性,你可以看看R.attr這個文檔。注意一下,並不是所有的View類都能接受全部同樣的style屬性,所以你最好能儘可能的在style裏創建那些需要應用此style所接受的屬性。不過,如果一個View視圖應用了一個style,但是這個View並不支持style裏的所有屬性,那麼這個View將使用那些它用得到的屬性,並忽略它那些用不到的屬性

還有一些style屬性,只支持被應用到主題theme裏,而不支持用在單個View裏。這些style屬性只支持運用到整個窗口而不支持單個View。例如,一些style屬性作爲作爲主題可以隱藏掉程序的標題、狀態欄,或者改變整個窗口的背景色。這些屬性並不屬於任何一個視圖View類。如果你想要知道有哪些style屬性屬於窗口特有的,你可以參考R.attr這個鏈接裏開頭的內容。例如,windowNoTitle和windowBackground這兩個屬性只在style應用在Activity或者整個程序裏纔有用。下一節內容就是關於style是怎麼作爲主題應用到Activity或程序裏的。

注意:不要忘了在每個<item>元素裏,都需要把android:這個命名空間放在前面,例如:<item name="android:inputType">。

在UI上設置Style和Theme


有兩種方式設置style:
1 : 對於單個視圖View,style在佈局文件裏設置屬性就行。
2 : 對於Activity或整個程序來說,只要在AndroidManfest裏的把android:theme屬性加到<activity>或<application>標籤裏就行。

當只在單個View裏設置style屬性時,style裏面的屬性值只對這個view起作用。如果你在ViewGroup設置style,是不會對ViewGroup裏面的子視圖起任何作用的,它只作用於所設置的視圖。如果你想設置一個style讓佈局文件下面的子視圖都起作用,可以把style作爲theme來設置。

想要把style當作theme,你必須在AndroidMainfest裏的Activity或appliaction標籤內設置。這樣設置,style裏的屬性就會在Activity或整個程序下面的每一個視圖起作用,如果那些屬性它支持的話。例如,如果你把前面例子裏的CodeFont 設置在一個Activity裏,那麼text style裏的屬性會在它下面的所有視圖View裏生效。對於那些不支持text style的View,View會自動忽略掉text style屬性,View只作用那些它能夠支持的屬性。

在View裏面設置style


下面是在View佈局裏設置一個style:
<TextView
    style="@style/CodeFont"
    android:text="@string/hello" />
現在CodeFont裏的屬性將被設置進TextView裏。注意:設置style屬性時不用加上android: 這個命名空間。

在Activity或application裏設置主題


如果想要讓一個程序裏的所有activity擁有同個主題,你可以打開AndroidMainfest.xml文件,在<application>標籤里加上android:theme屬性和所要引用style的名字。例如:
<application android:theme="@style/CustomTheme">
如果你想要設置一個activity的主題,只要把android:theme屬性加到<activity>標籤裏就好。

其實,Android自身也提供了很多資源文件供你調用,避免所有屬性都讓你親自創建。例如,你可以用Dialog主題來讓你的Activity看起來像個對話框:
<activity android:theme="@android:style/Theme.Dialog">
又或你想讓它的背景變得半透明,你只要用Translucent這個主題就行:
<activity android:theme="@android:style/Theme.Translucent">
如果你喜歡一個主題,但想調整一些屬性,你可以新建一個主題然後用parent屬性去繼承它。例如,你可以加上自己的顏色在普通的 light 主題上面:
<color name="custom_theme_color">#b0b0ff</color>
<style name="CustomTheme" parent="android:Theme.Light">
    <item name="android:windowBackground">@color/custom_theme_color</item>
    <item name="android:colorBackground">@color/custom_theme_color</item>
</style>
(請注意,上面例子裏的android:windowBackground屬性值只支持已經定義好了的顏色引用,不像android:colorBackground屬性值還可以直接用顏色的數值)

現在可以在AndroidMainfest裏用你自定義的主題取替代Theme.Light了:
<activity android:theme="@style/CustomTheme">

選擇一個基於平臺版本的主題


對於新版本的Android,會增加一些額外的主題,你可能會想讓這些主題運用於那些老版本的程序上。你可以在不同版本的資源文件目錄下,自定義一個主題去繼承新舊版本的主題。

例如,下面的例子就聲明瞭一個自定義的主題,在一個較老的系統平臺上,它的目錄是在 res/values下(通常是 res/values/styles.xml):
<style name="LightThemeSelector" parent="android:Theme.Light">
    ...
</style>
在新版本Android 3.0(API11)或以上,使用上面這個主題就得繼承自 新主題 holographic 了, 你可以在其他的資源目錄下面去聲明這個主題,只要它的parent屬性是holographic系的 :
<style name="LightThemeSelector" parent="android:Theme.Holo.Light">
    ...
</style>
現在你可以使用任何主題像這個例子一樣,當你的程序運行在Android 3.0 或以上,你的程序將自動轉換到holographic 系列主題。

關於標準主題裏有哪些可以用到的屬性你可以在R.styleable.Theme裏面查找。

如果你想知道不同版本的資源,像主題和佈局這些,在不同平臺和設備裏有哪些差異,你可以看看Providing Resource這個文檔。

使用平臺的style和theme


Android平臺提供裏一個"d98"的集合styles和主題(原文:a d98 large collection of styles and themes),可以在你的程序裏使用。你可以在R.style類裏找到所有你能夠引用的styles。在使用文檔裏的style時,你需要把下劃線去掉。例如,你可以用“@android:style/Theme.NoTitleBar”這種方式來使用Theme_NoTitleBar主題。

然而,上面那篇R.style的文檔,並不是一份好文檔,它沒有詳盡的描述style,所以你是最好看看這些樣式和主題的源碼,會讓你對它們有更好的認識。對於Android的樣式和主題有兩份源碼文檔可供參考:


這兩份文檔可以很好的幫助到你。例如,在Android 主題的源碼裏,你將會找到<style name="Theme.Dialog">的聲明,在聲明裏,你將看到Android框架關於dialog樣式都定義了哪些屬性。

如果你想知道更多關於styles 和 themes在xml裏的語法,請看Style Resource這份文檔。

關於style 或 theme裏有哪些屬性可以定義的更多信息(例如,"windowBackground" 或 "textAppearance"),請看R.attr或者相應View類文檔。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章