Android Styles and Themes

樣式

樣式是指能夠爲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>
複製代碼

這段代碼同時從CodeFontCodeFont.Red樣式繼承,而後添加android:textSize屬性。

注:這種經過將名稱連接起來的繼承方法只適用於由您本身的資源定義的樣式。 您沒法經過這種方法繼承 Android 內建樣式。 要引用內建樣式(例如 TextAppearance),您必須使用 parent 屬性。

對 UI 應用樣式和主題

設置樣式的方法有兩種:

  • 若是是對單個視圖應用樣式,請爲佈局 XML 中的 View 元素添加 style 屬性。
    <TextView
    style="@style/CodeFont"
    android:text="@string/hello" />
    複製代碼
  • 或者,若是是對整個 Activity 或應用來應用樣式,請爲 Android 清單中的 或 元素添加 android:theme 屬性。
    <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 或更高版本的系統上時自動切換到全息主題。

相關文章
相關標籤/搜索