樣式是指能夠爲View
或窗口
指定外觀和格式的屬性集合。樣式能夠指定高度、填充、字體顏色、字號、背景色等許多屬性。 樣式是在與指定佈局的XML文件
不一樣的XML資源中進行定義。android
主題是對整個Activity
或應用
而不是對單個View應用的樣式。以主題形式應用樣式時,Activity或者應用中的每一個視圖都將應用其支持的每一個樣式屬性。bash
要建立一組樣式,請在您的項目的 res/values/
目錄中保存一個 XML
文件。 可任意指定該 XML
文件的名稱,但它必須使用 .xml
擴展名,而且必須保存在 res/values/
文件夾內。app
該 XML 文件的根節點必須是 <resources>
。佈局
對於您想建立的每一個樣式,向該文件添加一個 <style>
元素,該元素帶有對樣式進行惟一標識的 name
屬性(該屬性爲必需屬性
)。而後爲該樣式的每一個屬性添加一個 <item>
元素,該元素帶有聲明樣式屬性以及屬性值的 name
(該屬性爲必需屬性)。 根據樣式屬性,<item>
的值能夠是關鍵字字符串、十六進制顏色值、對另外一資源類型的引用或其餘值。如下是一個包含單個樣式的示例文件:字體
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CodeFont" parent="@android:style/TextAppearance.Medium">
<item name="android:layout_width">match_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>
元素的 name 屬性中的值引用。 可從 XML 佈局以 @style/CodeFont
形式引用該示例樣式。spa
<style>
元素中的 parent
屬性是可選屬性,它指定應做爲此樣式所繼承屬性來源的另外一樣式的資源 ID。 若是願意,您可在隨後替換這些繼承的樣式屬性。code
注意,在
XML
中定義您想用做Activity
或應用主題
的樣式與定義視圖樣式的方法徹底相同。諸如上文所定義的樣式既能夠做爲單個視圖的樣式加以應用,也可做爲整個Activity
或應用的主題
加以應用。xml
經過 <style>
元素中的 parent
屬性指定應做爲您的樣式所繼承屬性來源的樣式。您能夠利用它來繼承現有樣式的屬性,而後只定義您想要更改或添加的屬性
。 您能夠從自行建立的樣式或平臺內建的樣式繼承屬性。對象
例如,您能夠繼承 Android 平臺的默認文本外觀,而後對其進行修改:繼承
<style name="GreenText" parent="@android:style/TextAppearance">
<item name="android:textColor">#00FF00</item>
</style>
複製代碼
若是您想從自行定義的樣式繼承屬性,則沒必要使用 parent
屬性, 而是 只需將您想繼承的樣式的名稱之前綴形式添加到新樣式的名稱之中,並以句點進行分隔
。
例如,要建立一個繼承上文定義的 CodeFont 樣式的新樣式,但將顏色設置爲紅色,您能夠按以下方式建立這個新樣式:
<style name="CodeFont.Red">
<item name="android:textColor">#FF0000</item>
</style>
複製代碼
請注意,<style>
標記中沒有 parent
屬性,但因爲name
屬性以 CodeFont
樣式名稱(這是您建立的一個樣式)開頭,所以這個樣式會繼承該樣式的全部樣式屬性。 這個樣式隨後會替換 android:textColor
屬性,將文本設置爲紅色。 您能夠 @style/CodeFont.Red
形式引用這個新樣式。
您能夠經過使用句點連接名稱繼續進行這樣的繼承,次數不限。 例如,您能夠經過如下代碼將 CodeFont.Red 擴大:
<style name="CodeFont.Red.Big">
<item name="android:textSize">30sp</item>
</style>
複製代碼
這段代碼同時從CodeFont
和CodeFont.Red
樣式繼承,而後添加android:textSize
屬性。
注:這種經過將名稱連接起來的繼承方法只適用於由您本身的資源定義的樣式。 您沒法經過這種方法繼承 Android 內建樣式。 要引用內建樣式(例如 TextAppearance),您必須使用 parent 屬性。
設置樣式的方法有兩種:
style
屬性。<TextView
style="@style/CodeFont"
android:text="@string/hello" />
複製代碼
<application android:theme="@style/CustomTheme">
<activity android:theme="@android:style/Theme.Dialog">
複製代碼
當您對佈局中的單個View
應用樣式時,該樣式定義的屬性只應用於該 View。 若是對ViewGroup
應用樣式,子View
元素將不會繼承樣式屬性只有被您直接應用樣式的元素纔會應用其屬性
。 不過,您能夠經過以主題形式應用樣式,使所應用的樣式做用於全部 View 元素。
要以主題形式應用樣式定義,您必須在 Android 清單中將樣式應用於 Activity 或應用。 若是您這樣作,Activity 或應用內的每一個 View 都將應用其支持的每一個屬性。 例如,若是您對某個 Activity 應用前面示例中的 CodeFont 樣式,則全部支持這些文本樣式屬性的 View 元素也會應用這些屬性。 任何不支持這些屬性的 View 都會忽略這些屬性。 若是某個 View 僅支持部分屬性,將只應用這些屬性。
新版本的 Android 可爲應用提供更多主題,您可能但願在這些平臺上運行時能夠使用這些新增主題,同時仍可兼容舊版本。 您能夠經過自定義主題來實現這一目的,該主題根據平臺版本利用資源選擇在不一樣父主題之間切換。
例如,如下這個聲明所對應的自定義主題就是標準的平臺默認明亮主題。 它位於 res/values
之下的一個 XML 文件(一般是 res/values/styles.xml
)中:
<style name="LightThemeSelector" parent="android:Theme.Light">
...
</style>
複製代碼
爲了讓該主題在應用運行在 Android 3.0
(API 級別 11)或更高版本系統上時使用更新的全息主題,您能夠在 res/values-v11
下的 XML 文件中加入一個替代主題聲明,但將父主題設置爲全息主題:
<style name="LightThemeSelector" parent="android:Theme.Holo.Light">
...
</style>
複製代碼
如今像您使用任何其餘主題那樣使用該主題,您的應用將在其運行於 Android 3.0 或更高版本的系統上時自動切換到全息主題。