聊聊安卓開發(fā)中主題樣式的一種組織架構(gòu)

在現(xiàn)階段的安卓開發(fā)中谎懦,有著大量高級的開發(fā)組織架構(gòu),例如MVP溃斋,MVVM或者Clean Architecture界拦,還有些瘋狂點(diǎn)的例如RxJava或者Dagger,甚至還有新語言出現(xiàn)梗劫,比如Kotlin享甸。
但是在大多數(shù)項(xiàng)目中,主題和樣式仍然是使用了最老式的方法梳侨,并沒有考慮其組織結(jié)構(gòu)蛉威。但是這些xml文件也是項(xiàng)目代碼的一部分问慎,所以展示它們也應(yīng)該像展示我們喜歡的Java代碼一樣滞伟。

一個常見問題

在一個新項(xiàng)目里雅宾,AS只會生成一個sytle.xml文件莹痢,里面有個初期的AppTheme的實(shí)現(xiàn)摩钙。當(dāng)你的項(xiàng)目慢慢變大麻汰,AppTheme也將會變大庐冯,里面將會放著很多你的主題/樣式屬性吐绵。

但是彼哼,在你項(xiàng)目的某些點(diǎn)上对妄,你可能需要添加一些API級別的特殊樣式屬性。例如敢朱,你的app的minSdk=16剪菱,但是你想要一個API19級別屬性摩瞎,這時你不能直接放到AppTheme 中了,否則xml文件將會報(bào)錯孝常。見圖

圖1.png

在安卓中旗们,你可以將一些資源文件放到特定API級別的文件夾中。例如构灸,你可以創(chuàng)建一個 res/values-v19/文件夾上渴,并且你可以向里面放入一個style.xml文件,當(dāng)項(xiàng)目運(yùn)行在一個API19甚至更高級別的設(shè)備上時喜颁,本文件具有更高的優(yōu)先級稠氮。由此,為引入API 19級別的新屬性半开,你有了2個簡單方式隔披。

  • .將res/values/styles.xml中的AppTheme 復(fù)制到-v19的style文件中,然后向新文件中添加新屬性寂拆。此時奢米,-v19 將會只應(yīng)用在API 19級別以及更高的設(shè)備。但是漓库,請不要這么做恃慧,因?yàn)橥瑫r維持這兩個文件將會是個大麻煩,因?yàn)槊燧铮坏┠阆胂騜ase theme添加新屬性時痢士,你不得不拷貝一份放到-v19 主題中。這才一個19呢茂装,若是再考慮-v21怠蹂,-v23呢。
圖2.png
  • 另一個方案是少态,在res/values/styles.xml中創(chuàng)建一個BaseAppTheme 城侧,里面列出所有的非指定性屬性。在同一個文件中彼妻,讓AppTheme 繼承BaseAppTheme嫌佑。在 -v19 version中,也這么操作侨歉。然后再向AppTheme中添加對于API級別的新屬性屋摇。當(dāng)以后需要添加通用屬性時,可以只改變BaseAppTheme 幽邓,而不用考慮別的文件炮温。

values/styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Base application theme. -->
    <style name="BaseAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowBackground">@color/windowBackground</item>
    </style>
    <style name="AppTheme" parent="BaseAppTheme"/>
</resources>

values-v19/styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="BaseAppTheme">
        <item name="android:windowTranslucentStatus">true</item>
    </style>
</resources>

更多的API級別

現(xiàn)在,你需要使用一個只有API 21級別的新屬性牵舵。你需要創(chuàng)建一個 res/values-v21/ folder柒啤,然后在里面創(chuàng)建一個style.xml文件倦挂。你創(chuàng)建AppTheme 繼承BaseAppTheme,然后將新屬性添加到這個文件中担巩。

values-v21/styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="BaseAppTheme">
        <item name="android:windowSharedElementEnterTransition">@android:animator/fade_in</item>
    </style>
</resources>

當(dāng)app運(yùn)行到安卓4.4設(shè)備時方援,狀態(tài)欄透明。而5.0以上設(shè)備時涛癌,狀態(tài)欄不再是透明的肯骇,也就是說,此時的AppTheme 在兩個API級別下獨(dú)立運(yùn)作祖很。

引入主題繼承鏈

為修復(fù)上述問題,我們重新寫下我們所有的主題漾脂。在res/values/styles.xml中假颇,創(chuàng)建一個具有通用屬性的Base.V0.AppTheme,該主題繼承AppCompat主題骨稿。在同一個文件中笨鸡,再創(chuàng)建個AppTheme 繼承于Base.V0.AppTheme。

values/styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="Base.V0.AppTheme"/>

    <style name="Base.V0.AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Generic, non-specific attributes -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowBackground">@color/windowBackground</item>
    </style>
</resources>

在res/values-v19/styles.xml里坦冠,創(chuàng)建一個 Base.V19.AppTheme形耗,然后將API 19的特殊屬性放進(jìn)去,該主題的父主題是Base.V0.AppTheme辙浑。在該文件中激涤,創(chuàng)建AppTheme 繼承于Base.V19.AppTheme。

values-v19/styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="Base.V19.AppTheme"/>
    
    <style name="Base.V19.AppTheme" parent="Base.V0.AppTheme">
        <!-- API 19 specific attributes -->
        <item name="android:windowTranslucentStatus">true</item>
    </style>
</resources>

在res/values-v21/styles.xml中判呕,創(chuàng)建Base.V21.AppTheme倦踢,然后將API 21的特殊屬性放進(jìn)去,該主題的父主題是 Base.V19.AppTheme侠草。在該文件中辱挥,創(chuàng)建AppTheme 繼承于Base.V21.AppTheme。
values-v21/styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="Base.V21.AppTheme"/>
    
    <style name="Base.V21.AppTheme" parent="Base.V19.AppTheme">
        <!-- API 21 specific attributes -->
        <item name="android:windowSharedElementEnterTransition">@android:animator/fade_in</item>
    </style>
</resources>

在這個主題架構(gòu)中边涕,對于每一個API級別晤碘,AppTheme將會具有所有API級別的屬性,并且它很容易擴(kuò)展功蜓,方便以后添加一些新的API級別特定屬性园爷。這也可以應(yīng)用到styles中,因?yàn)檫@不僅對于API級別特定屬性有效霞赫,同時對于重寫values值也適用腮介。下面舉個完整的例子,例子中有個View將會同時考慮手機(jī)和平板以及API級別21以上端衰。

values/styles.xml
提供默認(rèn)的手機(jī)屬性

<?xml version="1.0" encoding="utf-8"?>
<resources> 
<style name="Style.MainContent" parent="Base.Style.MainContent" /> 
<style name="Base.Style.MainContent" parent="Base.SW.Style.MainContent" />
<style name="Base.SW.Style.MainContent" parent="Base.SW0.Style.MainContent" /> 
<style name="Base.SW0.Style.MainContent" parent="Base.ApiLevel.Style.MainContent"> 
        <item name="android:layout_width">match_parent</item>
         <item name="android:layout_margin">8dp</item> 
</style> 
<style name="Base.ApiLevel.Style.MainContent" parent="Base.V0.Style.MainContent" /> 
<style name="Base.V0.Style.MainContent" parent=""> 
<item name="android:background">#FFFFFF</item> 
</style>
</resources>

values-v21/styles.xml
提供API 21+屬性

<?xml version="1.0" encoding="utf-8"?>
<resources> 
<style name="Base.ApiLevel.Style.MainContent" parent="Base.V21.Style.MainContent" />
 <style name="Base.V21.Style.MainContent" parent="Base.V0.Style.MainContent">
         <item name="android:elevation">4dp</item> 
</style>
</resources>

values-sw600dp/styles.xml
提供平板屬性

<?xml version="1.0" encoding="utf-8"?>
<resources> 
<style name="Base.SW.Style.MainContent" parent="Base.SW600.Style.MainContent" />
<style name="Base.SW600.Style.MainContent" parent="Base.SW0.Style.MainContent"> 
<item name="android:layout_width">480dp</item>
<item name="android:layout_margin">0dp</item> 
<item name="android:layout_gravity">center_horizontal</item>
 </style>
</resources>

上述例子叠洗,每一個屬性將只會寫一次甘改,很容易維護(hù),并且也很容易擴(kuò)展灭抑。
以上就是本文展示的一個定義和組織 主題和樣式的一種方式十艾,希望對大家有幫助。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腾节,一起剝皮案震驚了整個濱河市忘嫉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌案腺,老刑警劉巖庆冕,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異劈榨,居然都是意外死亡访递,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門同辣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拷姿,“玉大人,你說我怎么就攤上這事旱函∠斐玻” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵棒妨,是天一觀的道長踪古。 經(jīng)常有香客問我,道長券腔,這世上最難降的妖魔是什么灾炭? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮颅眶,結(jié)果婚禮上蜈出,老公的妹妹穿的比我還像新娘。我一直安慰自己涛酗,他們只是感情好铡原,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著商叹,像睡著了一般燕刻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上剖笙,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天卵洗,我揣著相機(jī)與錄音,去河邊找鬼。 笑死过蹂,一個胖子當(dāng)著我的面吹牛十绑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酷勺,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼本橙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脆诉?” 一聲冷哼從身側(cè)響起甚亭,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎击胜,沒想到半個月后亏狰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡偶摔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年骚揍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啰挪。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嘲叔,靈堂內(nèi)的尸體忽然破棺而出亡呵,到底是詐尸還是另有隱情,我是刑警寧澤硫戈,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布锰什,位于F島的核電站,受9級特大地震影響丁逝,放射性物質(zhì)發(fā)生泄漏汁胆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一霜幼、第九天 我趴在偏房一處隱蔽的房頂上張望嫩码。 院中可真熱鬧,春花似錦罪既、人聲如沸铸题。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丢间。三九已至,卻和暖如春驹针,著一層夾襖步出監(jiān)牢的瞬間烘挫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工柬甥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饮六,地道東北人其垄。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像喜滨,于是被迫代替她去往敵國和親捉捅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理虽风,服務(wù)發(fā)現(xiàn)棒口,斷路器,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • Android Themes & styles, a real architecture(譯) 在當(dāng)前的andro...
    Henryhaoson閱讀 1,188評論 0 3
  • 1.概述 本篇就為各位介紹 – toolbar辜膝,這是用來取代過去 actionbar 的控件无牵,而現(xiàn)在于 mater...
    一葉楓飄閱讀 1,022評論 0 1
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評論 25 707
  • 自己的好幾個微信都開通了公眾平臺,由于近期小程序呼聲那么高厂抖,心血來潮也想搞一搞茎毁,才發(fā)現(xiàn),申請時候需要注冊忱辅,個人的還...
    小學(xué)生的博客閱讀 376評論 0 0