Android樣式(style)和主題(theme)

樣式和主題

樣式是指爲 View 或窗口指定外觀和格式的屬性集合。樣式能夠指定高度、填充、字體顏色、字號、背景色等許多屬性。 樣式是在與指定佈局的 XML 不一樣的 XML 資源中進行定義。html

Android 中的樣式與網頁設計中層疊樣式表的原理相似 — 您能夠經過它將設計與內容分離。android

例如,經過使用樣式,您能夠將如下佈局 XML:bash

<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" />
複製代碼

佈局 XML 中全部與樣式有關的屬性都已移除,並置於一個名爲 CodeFont 的樣式定義內,而後經過 style 屬性加以應用。 您會在下文中看到對該樣式的定義。app

主題是指對整個 Activity 或應用而不是對單個 View(如上例所示)應用的樣式。 以主題形式應用樣式時,Activity 或應用中的每一個視圖都將應用其支持的每一個樣式屬性。 例如,您能夠 Activity 主題形式應用同一 CodeFont 樣式,以後該 Activity 內的全部文本都將具備綠色固定寬度字體。佈局

定義樣式

要建立一組樣式,請在您的項目的 res/values/ 目錄中保存一個 XML 文件。 可任意指定該 XML 文件的名稱,但它必須使用 .xml 擴展名,而且必須保存在 res/values/ 文件夾內。學習

該 XML 文件的根節點必須resources。字體

對於您想建立的每一個樣式,向該文件添加一個 style 元素,該元素帶有對樣式進行惟一標識的 name 屬性(該屬性爲必需屬性)。而後爲該樣式的每一個屬性添加一個 item 元素,該元素帶有聲明樣式屬性以及屬性值的 name(該屬性爲必需屬性)。 根據樣式屬性,item 的值能夠是關鍵字字符串、十六進制顏色值、對另外一資源類型的引用或其餘值。如下是一個包含單個樣式的示例文件:google

<?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>元素的 name 屬性中的值引用。 可從 XML 佈局以 @style/CodeFont 形式引用該示例樣式(如上文引言中所示)。spa

style 元素中的 parent 屬性是可選屬性,它指定應做爲此樣式所繼承屬性來源的另外一樣式的資源 ID。 若是願意,您可在隨後替換這些繼承的樣式屬性。設計

切記,在 XML 中定義您想用做 Activity 或應用主題的樣式與定義視圖樣式的方法徹底相同。 諸如上文所定義的樣式可做爲單個視圖的樣式加以應用,也可做爲整個 Activity 或應用的主題加以應用。 後文將闡述如何爲單個視圖應用樣式或如何以應用主題形式應用樣式。

繼承

您能夠經過 style 元素中的 parent 屬性指定應做爲您的樣式所繼承屬性來源的樣式。您能夠利用它來繼承現有樣式的屬性,而後只定義您想要更改或添加的屬性。 您能夠從自行建立的樣式或平臺內建的樣式繼承屬性。 (如需瞭解有關從 Android 平臺定義的樣式繼承屬性的信息,請參閱下文的使用平臺樣式和主題。) 例如,您能夠繼承 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 屬性。

樣式屬性

既然您已瞭解了樣式是如何定義的,就須要瞭解什麼類型的樣式屬性(由 item 元素定義)可使用。您多半已經熟悉了其中的一些,例如 layout_width 和 textColor。 固然,還有許多其餘樣式屬性可供您使用。

相應的類引用最便於查找適用於特定 View 的屬性,其中列出了全部支持的 XML 屬性。 例如,TextView XML 屬性表中所列的全部屬性均可在 TextView 元素(或其其中一個子類)的樣式定義中使用。 該引用中列出的其中一個屬性是 android:inputType,所以,若是您正常狀況下會在 EditText 元素中放置 android:inputType 屬性,以下所示:

<EditText
    android:inputType="number"
    ... />
您就能夠改成給包括該屬性的 EditText 元素建立一個樣式:

<style name="Numbers">
  <item name="android:inputType">number</item>
  ...
</style>
複製代碼

這樣您的佈局 XML 如今即可實現這個樣式:

<EditText
    style="@style/Numbers"
    ... />
複製代碼

這個簡單示例可能顯得工做量更大,但若是您添加更多樣式屬性並將可以在各類地方重複使用樣式這一因素考慮在內,就會發現回報可能很豐厚。

如需查看全部可用樣式屬性的參考資料,請參閱 R.attr 參考資料。 切記,全部 View 對象仍然不接受樣式屬性,所以正常狀況下您應該引用所支持樣式屬性的具體 View 類。 不過,若是您應用樣式的 View 不支持全部樣式屬性,該 View 將只應用那些受支持的屬性,並直接忽略其餘屬性。

不過,某些樣式屬性任何 View 元素都不提供支持,只能以主題形式應用。 這些樣式屬性應用於整個窗口而非任何類型的 View。例如,主題的樣式屬性能夠隱藏應用標題、隱藏狀態欄或更改窗口的背景。 這些類型的樣式屬性不屬於任何 View 對象。要發現這些僅主題樣式屬性,請在 R.attr 參考資料中查看有關以 window 開頭的屬性的內容。 例如,windowNoTitle 和 windowBackground 是隻有在樣式以主題形式應用於 Activity 或應用時才起做用的樣式屬性。 請參閱下文有關以主題形式應用樣式的信息。

注:別忘了使用 android: 命名空間爲每一個 item 元素中的屬性名稱添加前綴。

例如:<item name="android:inputType">。
複製代碼

對 UI 應用樣式和主題

設置樣式的方法有兩種:

若是是對單個視圖應用樣式,請爲佈局 XML 中的 View 元素添加 style 屬性。 或者,若是是對整個 Activity 或應用來應用樣式,請爲 Android 清單中的 activity 或 application 元素添加 android:theme 屬性。 當您對佈局中的單個 View 應用樣式時,該樣式定義的屬性只應用於該 View。 若是對 ViewGroup 應用樣式,子 View 元素將不會繼承樣式屬性 — 只有被您直接應用樣式的元素纔會應用其屬性。 不過,您能夠經過以主題形式應用樣式,使所應用的樣式做用於全部 View 元素。

要以主題形式應用樣式定義,您必須在 Android 清單中將樣式應用於 Activity 或應用。 若是您這樣作,Activity 或應用內的每一個 View 都將應用其支持的每一個屬性。 例如,若是您對某個 Activity 應用前面示例中的 CodeFont 樣式,則全部支持這些文本樣式屬性的 View 元素也會應用這些屬性。 任何不支持這些屬性的 View 都會忽略這些屬性。 若是某個 View 僅支持部分屬性,將只應用這些屬性。

對視圖應用樣式

爲 XML 佈局中的視圖設置樣式的方法以下:

<

TextView
    style="@style/CodeFont"
    android:text="@string/hello" />
如今該 TextView 將按照名爲 CodeFont 的樣式的定義設置樣式(請參閱上文定義樣式中的示例)。
複製代碼

注:style 屬性不使用 android: 命名空間前綴。

對 Activity 或應用應用主題 要爲您的應用的全部 Activity 設置主題,請打開 AndroidManifest.xml 文件並application 標記,在其中加入帶樣式名稱的 android:theme 屬性。 例如:

<application android:theme="@style/CustomTheme">
若是您只想對應用中的一個 Activity 應用主題,則改成給 <activity> 標記添加 android:theme 屬性。
複製代碼

正如 Android 提供了其餘內建資源同樣,有許多預約義主題可供您使用,可免於自行編寫。 例如,您可使用 Dialog 主題,爲您的 Activity 賦予相似對話框的外觀:

<activity android:theme="@android:style/Theme.Dialog">
或者,若是您但願背景是透明的,則可以使用 Translucent 主題:

<activity android:theme="@android:style/Theme.Translucent">
複製代碼

若是您喜歡某個主題,但想作些調整,只需將該主題添加爲您的自定義主題的 parent。 例如,您能夠像下面這樣對傳統明亮主題進行修改,使用您本身的顏色:

<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,沒法爲其提供顏色字面量。)

如今,在 Android 清單內使用 CustomTheme 替代 Theme.Light:

<activity android:theme="@style/CustomTheme">
複製代碼

根據平臺版本選擇主題 新版本的 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 或更高版本的系統上時自動切換到全息主題。

R.styleable.Theme 提供了可在主題中使用的標準屬性的列表。

如需瞭解有關根據平臺版本或其餘設備配置提供備用資源(例如主題和佈局)的詳細信息,請參閱提供資源文檔。

使用平臺樣式和主題

Android 平臺提供了龐大的樣式和主題集合,供您在應用中使用。 您能夠在 R.style 類中找到全部可用樣式的參考資料。 要使用此處所列樣式,請將樣式名稱中的全部下劃線替換爲句點。 例如,您可使用 "@android:style/Theme.NoTitleBar" 應用 Theme_NoTitleBar 主題。

不過,R.style 參考資料並不完備,未對樣式作全面說明,所以查看這些樣式和主題的實際源代碼可以讓您更清楚地瞭解每一個樣式提供的樣式屬性。如需查看更詳實的 Android 樣式和主題參考資料,請參閱如下源代碼: Android 樣式 (styles.xml) Android 主題 (themes.xml)

這些文件有助於您經過示例進行學習。例如,在 Android 主題源代碼中,您能夠找到

相關文章
相關標籤/搜索