Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android開發入門:樣式和主題(Styles and Themes)

Android開發入門:樣式和主題(Styles and Themes)

編輯:關於Android編程

這篇文章是官方文檔的翻譯和筆記。對應於官方文檔的develop--API Guides--User Interface--Styles and Themes

文章結構:

0. 樣式和主題

1. 定義樣式

1.1 定義樣式的步驟

1.2 繼承

1.2 多層次繼承

1.4 樣式屬性

2. 為UI使用樣式和主題

2.1 為單個視圖使用樣式

2.2 為Activity或應用程序使用主題

2.3 根據不同平台版本選擇主題

3. 使用平台的樣式和主題


0. 樣式和主題(Styles and Themes)

樣式(style)是用來指定視圖或窗口的外觀和格式的一組屬性集合。樣式可以用來指定高度、填充、自字體大小、背景顏色等等。樣式在XML資源文件中定義,和指定布局的XML文件是分開的。

安卓中的樣式和網頁設計中的CSS(級聯樣式表)踐行同樣的哲學:將設計和內容分開。

例如,你可以把下面這個布局XML

變成下面這樣:

所有和樣式相關的屬性都從布局文件中移動到了一個名為CodeFont的樣式定義中。這個樣式定義會在下文給出。


主題(theme)是應用到整個activity或者應用程序的樣式。而不是像上面的例子一樣只應用到單個視圖。當一個樣式變成主題後,Activity或應用程序中的所有視圖都將應用這個樣式中它所支持的屬性。例如,你可以將上面例子中的GodeFont樣式作為一個activity的主題,然後這個Activity中所有的文字都將變成monospace字體。


1. 定義樣式(Defining Styles)

1.1 創建樣式的步驟:

1.在工程的res/values目錄下創建一個XML文件。這個XML文件的根節點必須是

2.為每一個你要創建的樣式創建一個 的每個子元素在編譯期間都會被轉化為一個應用程序資源對象。為每一個樣式指定name後,IDE會在R文件中為這個樣式創建一個ID,以後就可以在布局文件中根據@style/id來引用相應的樣式。比如要引用上面定義的樣式,可以使用@style/CodeFont。


如果你要繼承自己定義的樣式,你不需要使用parent屬性,只需要在把你新定義的樣式的name的前綴名設為你要繼承的屬性的name。前綴name和name用點號分開。例如,如果你要定義一個新顏色繼承自CodeFont樣式,然後把字體顏色設為紅色,你可以這樣定義這個樣式:

注意:雖然這個樣式沒有使用parent屬性,但是它的name前綴是CodeFont,所以這個演示繼承了CodeFont樣式的所有屬性,但是將text顏色修改成了紅色。你可以用@style/CodeFont.Red來引用這個樣式。


1.3 多層次繼承

只要你願意,你可以任意擴展繼承層次。還是通過name來進行。比如,你可以這樣來繼承CodeFont.Red:

這個樣式繼承了CodeFont和CodeFont.Red樣式所有屬性,然後添加了一個android:textSize屬性。現在你可以用@/style/CodeFont.Red.Big來引用它。

注意:通過改name來繼承樣式的方法只適用於你自己定義的樣式。想要繼承Android內置的樣式,你還得用parent屬性。


1.4 樣式屬性

現在你已經知道樣式是怎麼定義的了,你還得知道在元素中哪些樣式屬性是可以利用的。你可能已經熟悉了一些,比如layout_width和textColor。還有很多樣式屬性我們可以使用。

查看一個視圖可以支持哪些屬性,最好的地方是它對應的class reference,那兒列出了它能支持的所有XML屬性。比如,所有在TextView XML attributes表中列出的屬性都可以在為TextView的樣式中使用。其中列出的一個屬性是android:inputType,以前你可能在元素中使用android:inputType,就像這樣:

現在你可以為EditText創建一個樣式,來包含這個屬性

這樣你就可以在布局文件中這樣寫了

這個簡單例子中,使用樣式的方法好像比沒使用樣式方法多做了一些工作,但是,當你需要很多樣式屬性時,我們就可以在很多地方重復利用這個定義的樣式,這個回報是值得的。(定義一次,多次使用)

想查看所有可能的樣式屬性,看R.attr reference。記住,並不是所有的視圖對象都支持相同的樣式屬性,所以你通常應該參考特定視圖類型來查看所支持的樣式屬性。然而,如果你將一個樣式應用到一個視圖,而這個視圖並不支持這個樣式中所有屬性,視圖將只應用它支持的屬性,而忽略那些它不支持的屬性。


一些樣式屬性,不適用於任何視圖元素,只能應用到主題上。這些樣式屬性適用於整個窗口而不是任何視圖類型。比如,一些主題的樣式屬性可以隱藏應用標題,隱藏工具欄,或者改變窗口的背景,這些屬性就不屬於任何視圖對象。想查看這些theme-only樣式屬性,查看R.attr參考中以”window“開通的屬性。比如windowNoTitle和windowBackground只有在樣式作為主題應用到Activity或整個應用程序時才有效。

注意:不要忘記中的屬性名稱都以命名空間android:開頭。比如:



2. 為UI設置樣式和主題

2.1 為單個視圖設置樣式

要為單個視圖設置樣式,你需要在XML布局文件中找到對應的視圖標簽,並為之添加sytle屬性。

比如,下面的例子為一個TextView設置CodeFont樣式。

注意style屬性沒有用android:前綴


2.2 為Activity或應用程序設置主題

為Activity或應用程序設置主題,你需要在Androidmanifest.xml文件中為或標簽添加android:theme屬性。

比如,下面的例子為整個應用程序設置主題:

下面的例子為一個Activity設置主題:


就像Android提供了其他內置資源一樣,Android也提供了很多預先定義好的主題供你使用。比如你可以使用內置的Dialog主題來是你的Activity看起來像一個對話框。



或者你想讓你的Activity背景透明,你可以使用Translucent主題



如果你喜歡某個內置主題,但是想做細微的修改,你可以自定義一個主題並繼承這內置主題。比如下面這樣:

#b0b0ff
然後,你就可以在Android Manifest為Activity指定主題了



2.3 為不同的平台版本選擇不同主題

Android的新版本為應用程序提供了二外的主題。你可能想在應用程序中使用這些主題,同時又想兼容老的平台版本。你可以利用資源選擇參數來做到這一點:在不同的平台版本上使用不同的父主題。

比如,這裡有一個自定義主題簡單的繼承子平台默認的light theme。它可能出現在res/values目錄下的一個XML文件中(一般是res/values/stryles.xml):

想在Android 3.0(API Level 11)或者更高的平台上使用新的全息主題,你可以在res/values-v11目錄下為主題創建一個備選的主題,但是保證parent是全息主題:

現在你按照一般的方式使用這個主題,當運行在Android 3.0或者更高的版本時,你的應用程序會自動切換到全息主題。


你可以在R.styleabel.Theme中找到一張關於你能在主題中使用的標准屬性表。

想知道更多地關於”根據不同平台版本或其他設備配置提供可選資源,比如如主題和布局“,請查看Providing Resources文檔。



3. 使用平台的主題和樣式

Android平台提供了一大堆樣式和主題,你完全可以在你的應用程序中使用。你可以在R.style class中找到一份關於所有可使用的樣式參考。要使用所有在這份參考中列出的樣式,你需要將樣式name的下劃線換成點號。比如,你可以通過”@android:style/Theme.NoTitleBar“來使用這裡列出的Theme_NoTitleBar主題。

然而,這份R.stytle 參考並是一份好的文檔,而且描述的不全面。但是,通過閱讀關於這些樣式和主題的真實代碼可以讓你更好的理解它們提供了哪些屬性。想更多低了解Android 樣式和主題,請閱讀下面的源代碼:

Android Styles(styles.xml)Android Themes(themes.xml) 這些文件會通過例子來幫助你理解。例如,在Android themes源代碼中,你會找到