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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容