Android開(kāi)發(fā)基礎(chǔ)-主題和樣式(磨礪營(yíng)馬劍威)

樣式和主題(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乾戏,一起剝皮案震驚了整個(gè)濱河市迂苛,隨后出現(xiàn)的幾起案子三热,更是在濱河造成了極大的恐慌,老刑警劉巖三幻,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件就漾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡念搬,警方通過(guò)查閱死者的電腦和手機(jī)抑堡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門摆出,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人首妖,你說(shuō)我怎么就攤上這事偎漫。” “怎么了有缆?”我有些...
    開(kāi)封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵象踊,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我棚壁,道長(zhǎng)杯矩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任袖外,我火速辦了婚禮史隆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘曼验。我一直安慰自己泌射,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布鬓照。 她就那樣靜靜地躺著魄幕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪颖杏。 梳的紋絲不亂的頭發(fā)上纯陨,一...
    開(kāi)封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音留储,去河邊找鬼翼抠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛获讳,可吹牛的內(nèi)容都是我干的阴颖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼丐膝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼量愧!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起帅矗,我...
    開(kāi)封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤偎肃,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后浑此,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體累颂,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了紊馏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片料饥。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖朱监,靈堂內(nèi)的尸體忽然破棺而出岸啡,到底是詐尸還是另有隱情,我是刑警寧澤赫编,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布凰狞,位于F島的核電站,受9級(jí)特大地震影響沛慢,放射性物質(zhì)發(fā)生泄漏赡若。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一团甲、第九天 我趴在偏房一處隱蔽的房頂上張望逾冬。 院中可真熱鬧,春花似錦躺苦、人聲如沸身腻。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嘀趟。三九已至,卻和暖如春愈诚,著一層夾襖步出監(jiān)牢的瞬間她按,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工炕柔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酌泰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓匕累,卻偏偏與公主長(zhǎng)得像陵刹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子欢嘿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,770評(píng)論 25 707
  • 樣式和主題(Styles and Themes) 一個(gè)樣式(Style)是一個(gè)包含了指定樣子和格式的作用于視圖控件...
    張?jiān)骑wVir閱讀 2,828評(píng)論 0 51
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程衰琐,因...
    小菜c閱讀 6,365評(píng)論 0 17
  • 這是河南省信陽(yáng)市的一個(gè)地方這張照片是很多年前的 那個(gè)時(shí)候的浉河 下雨天的大市場(chǎng)是這樣的 里面的風(fēng)景是這樣的 最幸福...
    彭逗逗是大魔王閱讀 431評(píng)論 8 2
  • 昨晚冬令時(shí)轉(zhuǎn)夏令時(shí),一早起來(lái)看了看手機(jī)炼蹦,心想羡宙,我又虧了一個(gè)小時(shí),笑框弛。 巴黎的春似乎已經(jīng)來(lái)到辛辨,春寒料峭捕捂,但久違的燦爛...
    voutetoilee閱讀 175評(píng)論 0 0