樣式和主題(Styles and Themes)
? ? ? ? 一個(gè)樣式(Style)是一個(gè)包含了指定樣子和格式的作用于視圖控件(View)或者窗體(Window)屬性集合忽媒。一個(gè)style可以指定很多屬性,比如 高度呆馁,填充,字體顏色沙热,字體尺寸脓斩,背景色等香椎。一個(gè)Style在xml資源文件中定義,并且和在xml中指定的布局區(qū)分開(kāi)來(lái)抗斤。
? ? ? ? 在Android里的樣式和Web設(shè)計(jì)中的CSS共享一個(gè)相似的原理囚企,它們?cè)试S你分離設(shè)計(jì)(Design)和內(nèi)容(Content).
? ? ? ? 舉個(gè)例子,通過(guò)使用一個(gè)style瑞眼,你可以讓你的布局xml像下面這樣:
android:text="@string/hello" />
并且龙宏,可以變成下面這樣:
style="@style/CodeFont"
android:text="@string/hello" />
? ? ? ? 所有關(guān)聯(lián)到style的屬性已經(jīng)在布局xml中被刪除了,并且放在一個(gè)叫做“CodeFont”style中定義了伤疙。它通過(guò)一個(gè)style屬性被應(yīng)用上银酗。在下面的章節(jié),你將會(huì)看到如何定義style。
? ? ? ? 一個(gè)主題(Theme)也是一個(gè)style,它被應(yīng)用在所有的Activity或者application上黍特,而不是個(gè)別的視圖控件(View)(像上面的示例一樣)蛙讥。當(dāng)一個(gè)style被當(dāng)做一個(gè)theme來(lái)應(yīng)用,每一個(gè)activity或者application中的視圖控件將應(yīng)用每一個(gè)它支持的樣式屬性衅澈。比如键菱,你可以在activity上使用相同的CodeFont樣式作為一個(gè)theme,這時(shí)Activity里的所有內(nèi)部字體將會(huì)變成CodeFont樣式的字體樣式變成綠色的等寬字體今布。
定義一個(gè)樣式Style
? ? ? ? 為了創(chuàng)建一些樣式经备,你可以保存在你的工程下的 res/Values/ 文件夾下的一個(gè)XML文件中。XML文件的名字是隨意的部默,但是必須擴(kuò)展名是 .xml 并且存放在 res/Values/ 文件夾下侵蒙。
XML文件的根節(jié)點(diǎn)必須是
? ? ? 為你創(chuàng)建的每個(gè)樣式,添加一個(gè)
? ? ? 每一個(gè)元素的子節(jié)點(diǎn)在編譯時(shí)都被轉(zhuǎn)換成一個(gè)程序資源對(duì)象傅蹂。它可以通過(guò)
? ? ? 如果你想要繼承你自己創(chuàng)建的樣式纷闺,你不需要一定適用parent屬性。作為替代份蝴,可以為一個(gè)你想繼承的樣式的名字構(gòu)建前綴而作為你的新的樣式的名稱犁功,中間用“點(diǎn)”隔開(kāi)。比如婚夫,為了創(chuàng)建一個(gè)樣式浸卦,比如繼承自上面的CodeFont樣式,但是讓顏色變成紅色案糙,你可以這樣寫你的新樣式:
? ? ? ? 你可以繼續(xù)這樣繼承很多次限嫌,使用“點(diǎn)”鏈接這些名稱,比如时捌,你可以擴(kuò)展CodeFont.Red 變大一些怒医,像下面這樣:
? ? ? ? 注意:這樣的通過(guò)鏈接名稱的方式來(lái)繼承的方法,僅僅能用于你自己定義的資源文件中的樣式奢讨。你不能用于繼承安卓?jī)?nèi)置的樣式稚叹。要想引用內(nèi)置的樣式,比如TextAppearance,拿诸,你必須使用parent屬性入录。
樣式屬性
? ? ? 現(xiàn)在,你明白了如何定義一個(gè)樣式佳镜,你需要去學(xué)會(huì) 在元素下什么類型被定義的樣式屬性是可用的僚稿。你可能已經(jīng)熟悉了很多已經(jīng)有的,比如layout_width和textColor. 當(dāng)然蟀伸,還有很多的樣式屬性你可以使用蚀同。
... />
你可以為EditText 元素創(chuàng)建一個(gè)樣式缅刽,包含這個(gè)屬性,來(lái)代替上面:
這樣你的布局用的XML能夠這樣實(shí)現(xiàn)樣式:
style="@style/Numbers"
... />
? ? ? 這個(gè)簡(jiǎn)單的示例看起來(lái)多做了一些工作蠢络,不過(guò)當(dāng)你添加更多的樣式屬性并且把在多處可重用樣式的能力作為參考因素的話衰猛,你的付出將是值得的。
? ? ? 獲得所有可用樣式的屬性的引用(reference)刹孔,請(qǐng)參閱R.attr引用啡省。記住,所有的視圖控件對(duì)象不接受所有相同的屬性髓霞,這樣你可以平常的引用圖為視圖控件類指定支持的樣式屬性卦睹。然而,如果你為某個(gè)視圖控件應(yīng)用了一個(gè)樣式方库,這個(gè)樣式包含的屬性中不是都被支持的结序,視圖控件將會(huì)應(yīng)用那些屬性中的可被支持的并且簡(jiǎn)單的忽略其他的。
? ? ? 一些樣式屬性纵潦,不被支持在視圖控件里使用徐鹤,僅僅能作為主題使用。那些樣式屬性應(yīng)用在所有的窗體上邀层,不能用在任何視圖控件上返敬。比如有些樣式屬性可以隱藏應(yīng)用程序的標(biāo)題,隱藏狀態(tài)條寥院,或者更改窗體的背景劲赠。那些類型的樣式屬性不屬于任何視圖控件對(duì)象。要發(fā)現(xiàn)更多 僅僅作用于theme主題 的屬性只磷,查看R.attr引用中的以windows開(kāi)始的屬性经磅。比如泌绣,windowNoTitle和windowBackground屬性只能在應(yīng)用于activity和application時(shí)發(fā)生作用钮追。參閱下一章節(jié)可以獲得更多“在theme中應(yīng)用樣式”的內(nèi)容。
在UI上應(yīng)用樣式和主題
有兩種方式設(shè)置一個(gè)樣式:
· 為單個(gè)視圖控件指定樣式阿迈,在XML布局文件中的視圖元素上添加style屬性元媚。
· 為整個(gè)activity或者application指定樣式,在manifest.xml中的或者節(jié)點(diǎn)元素中添加android:theme 屬性苗沧。
? ? ? 當(dāng)你為布局里的單個(gè)控件中應(yīng)用一個(gè)樣式刊棕,你的樣式中定義的屬性都會(huì)應(yīng)用在這個(gè)視圖組件中。如果你的樣式應(yīng)用在一個(gè)ViewGroup中待逞,它的所有子控件元素將不能繼承這些樣式的屬性甥角,只有你直接指定的那個(gè)視圖元素可以應(yīng)用這些屬性。不過(guò)识樱,你仍然可以通過(guò)主題的方式為你的應(yīng)用下的所有視圖元素應(yīng)用樣式嗤无。
? ? ? 要想應(yīng)用一個(gè)主題震束,你必須在manifest.xml中為activity或者aplication上應(yīng)用樣式。當(dāng)你這么做当犯,每一個(gè)Activity或者aplication里的視圖元素都將應(yīng)用這些樣式中它支持的屬性垢村。比如,如果應(yīng)用上面提到的CodeFont樣式在一個(gè)Activity上嚎卫,這是所有的支持文本樣式屬性的視圖元素將應(yīng)用它們嘉栓。一些不支持這些屬性的視圖元素將忽略它們。如果一個(gè)視圖支持一部分屬性拓诸,那么它將只應(yīng)用這些屬性侵佃。
在視圖元素中應(yīng)用樣式
下面演示如何在XML布局中設(shè)置一個(gè)樣式:
style="@style/CodeFont"
android:text="@string/hello" />
現(xiàn)在 TextView將具有樣式,像CodeFont定義的屬性描述的一樣恰响。你可以參考上面的示例趣钱。
注意:樣式style 不需要使用androidoi: 命名空間前綴。
在activity或者application中應(yīng)用樣式
? ? ? 要想再你的所有activity或者application上使用樣式胚宦,打開(kāi)AndroidManifest.xml并且修改標(biāo)簽首有,讓它包含android:theme屬性并指定一個(gè)樣式名稱,比如:
? ? ? 如果你想為你的應(yīng)用中的某個(gè)activity使用樣式枢劝,那么添加android:theme到你的標(biāo)簽中井联。
? ? ? 安卓提供了一些內(nèi)置資源,你可以使用這些預(yù)先定義好的樣式您旁,而不用自己再重新寫了烙常。比如,你可以使用Dialog主題讓你的Activity 表現(xiàn)的像一個(gè) 對(duì)話框:
或者你想讓你的背景透明鹤盒,使用 透明主題:
? ? ? 如果你喜歡主題蚕脏,但是想開(kāi)足馬力使用它,那么你可以添加它到你的自定義主題中的parent屬性上繼承它侦锯。比如驼鞭,你可以修改 傳統(tǒng)的 light theme 主題并使用你的自己的顏色,像下面這樣:
#b0b0ff
? ? ? 現(xiàn)在尺碰,在你的Mnaifest文件中挣棕,可以使用CustomTheme代替 Theme.Light:
? ? ? 選擇一個(gè)平臺(tái)支持的樣式作為基礎(chǔ)
? ? ? 安卓較新的版本為應(yīng)用提供了額外的可用的樣式,同時(shí)你可能想要使用它們?cè)谀切┢脚_(tái)上運(yùn)行亲桥,并且仍然和老版本保持兼容洛心。你可以通過(guò)自定樣式做到,使用“資源選擇器"來(lái)切換不同的父主題题篷,基于平臺(tái)版本词身。
? ? ? 比如,下面是一個(gè)自定義樣式的聲明番枚,這個(gè)樣式是個(gè)簡(jiǎn)單的標(biāo)準(zhǔn)平臺(tái)默認(rèn)的 light theme主題法严。它可能被放置在res/valeus文件夾下的 XML文件中(經(jīng)典的是在 res/values/styles.xml)璧瞬。
? ? ? 當(dāng)應(yīng)用跑在Android 3.0(API級(jí)別11)或者更高以上時(shí),可以讓這個(gè)樣式使用較為新一些的holo風(fēng)格主題渐夸,你可以放置一個(gè)可供選擇的聲明樣式防止在res/values-v11這個(gè)文件夾下的XML文件中嗤锉,但是讓這個(gè)樣式繼承自 holo風(fēng)格的主題:
? ? ? 現(xiàn)在可以像任意其他那樣來(lái)使用這個(gè)主題,并且當(dāng)跑在安卓3.0以上時(shí)墓塌,你的應(yīng)用程序會(huì)自動(dòng)切換到holo風(fēng)格的主題瘟忱。
在R.styleable.Theme. 里,可以找到一個(gè)標(biāo)準(zhǔn)的屬性列表供你使用苫幢。
? ? ? 關(guān)于更多的信息访诱,像比如主題和布局,基于平臺(tái)版本或者設(shè)備配置等切換資源文件選擇韩肝,你可以閱讀Providing Resources触菜。
使用平臺(tái)樣式和主題
? ? ? 安卓平臺(tái)提供了很多樣式和主題,供你在應(yīng)用程序中使用哀峻。在R.style類里你可以找到可以用的引用涡相。為了使用這里列出的樣式,你可以使用”點(diǎn)“替換所有的下劃線分割的 樣式名稱剩蟀,比如催蝗,你可以通過(guò)”"@android:style/Theme.NoTitleBar".來(lái)使用Theme_NoTitleBar樣式。
? ? ? R.style引用育特,然而丙号,不是和好的文件記錄,并且不能全面的描述樣式缰冤,那么查看那些樣式和主題的實(shí)際的資源代碼可以給你更好一些關(guān)于”各個(gè)被提供樣式屬性“的的理解犬缨。獲得更多關(guān)于樣式和主題的引用,你可以看下面的源代碼:
·Android Styles (styles.xml)
·Android Themes (themes.xml)
? ? ? 那些文件將通過(guò)實(shí)例幫助你學(xué)習(xí)棉浸。比如怀薛,在安卓的主題源代碼中,你將找到一個(gè)聲明.在這些定義里涮拗,你將會(huì)看到所有的常常用到的 ”被用于安卓框架的樣式對(duì)話框的屬性“
? ? ? 更多內(nèi)容關(guān)注微信公眾號(hào)mjw-java或訪問(wèn)www.moliying.com