標籤:引用 子類 主題 地方 item 項目 網頁 eve developer
轉載:https://gold.xitu.io/post/58441c48c59e0d0056a30bc2樣式和主題
樣式是指為 View 或視窗指定外觀和格式的屬性集合。樣式可以指定高度、填充、字型顏色、字型大小、背景色等許多屬性。 樣式是在與指定布局的 XML 不同的 XML 資源中進行定義。
Android 中的樣式與網頁設計中層疊樣式表的原理類似 — 您可以通過它將設計與內容分離。
例如,通過使用樣式,您可以將以下布局 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" />
布局 XML 中所有與樣式有關的屬性都已移除,共置於一個名為 CodeFont 的樣式定義內,然後通過 style 屬性加以應用。 您會在下文中看到對該樣式的定義。
主題是指對整個 Activity 或應用而不是對單個 View(如上例所示)應用的樣式。 以主題形式應用樣式時,Activity 或應用中的每個視圖都將應用其支援的每個樣式屬性。 例如,您可以 Activity 主題形式應用同一 CodeFont 樣式,之後該 Activity 內的所有文本都將具有綠色等寬字型。
定義樣式
要建立一組樣式,請在您的項目的 res/values/ 目錄中儲存一個 XML 檔案。 可任意指定該 XML 檔案的名稱,但它必須使用 .xml 副檔名,並且必須儲存在 res/values/ 檔案夾內。
該 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">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 形式引用該樣本樣式(如上文引言中所示)。
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 樣式 (style) 和主題(theme)