動態(tài)換膚

1楣富、使用Android Support Library修改uiMode來實現(xiàn)

修改uimode是修改Configuration凿掂,這種主題切換只限于黑白模式,沒有其他模式纹蝴,不需要大量定義主題庄萎。

由于Support Library在23.2.0(6.0)的版本中才添加了Theme.AppCompat.DayNight主題,所以依賴的版本必須是高于23.2.0的塘安,并且糠涛,這個特性支持的最低SDK版本為14(4.0),所以耙旦,需要兼容Android 4.0的設(shè)備,是不能使用這個特性的萝究。

1)添加依賴

compile 'com.android.support:appcompat-v7:25.1.0'

2)新建夜間模式資源文件夾

在res目錄下新建values-night文件夾免都,然后在此目錄下新建colors.xml文件在夜間模式下的應用的資源。當然也可以根據(jù)需要新建drawable-night,layout-night等后綴為-night的夜間資源文件夾帆竹。
我的values和values-night目錄下的colors.xml的內(nèi)容如下:

<?xml version="1.0" encoding="utf-8"?>
<!--FIXME 2-->
<!--這個文件中的color是夜間模式下使用的-->
<resources>
    <color name="colorPrimary">#35464e</color>
    <color name="colorPrimaryDark">#212a2f</color>
    <color name="colorAccent">#212a2f</color>
    <color name="textColorPrimary">#616161</color>
    <color name="viewBackground">#212a2f</color>
</resources>
3) 將activity繼承AppCompatActivity
   public class MainActivity extends AppCompatActivity{}
4) 在Application中指定夜間模式绕娘,一般將當前主題保存到SharedPreferences中
public class App extends Application {
    @Override
    public void onCreate() {
    super.onCreate();
    //FIXME 4
    boolean isNight = SpUtil.getNightModel(this);
    if (isNight) {
        //使用夜間模式
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
    } else {
        //不使用夜間模式
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
    }
   }
}

setDefaultNightMode()方法中參數(shù)解釋:

MODE_NIGHT_NO. Always use the day (light) theme(一直應用日間(light)主題).
MODE_NIGHT_YES. Always use the night (dark) theme(一直使用夜間(dark)主題).
MODE_NIGHT_AUTO. Changes between day/night based on the time of day(根據(jù)當前時間在day/night主題間切換).
MODE_NIGHT_FOLLOW_SYSTEM(默認選項). 
This setting follows the system’s setting, which is essentially MODE_NIGHT_NO
(跟隨系統(tǒng),通常為MODE_NIGHT_NO).
注意:

為什么不直接設(shè)置為MODE_NIGHT_AUTO呢栽连?引用

因為使用MODE_NIGHT_AUTO需要請求坐標權(quán)限险领,獲取系統(tǒng)的位置。你肯定會說了秒紧,這尼瑪不是坑爹嗎绢陌?如果程序已經(jīng)授予了坐標權(quán)限(location permission)(如果你的target SDK為23或者更高,需要考慮運行時權(quán)限)熔恢,AppCompat會試著去獲取上次保存的坐標脐湾,根據(jù)坐標來計算日出與日落的時間。如果程序沒有位置權(quán)限或者LocationManager沒有存儲上次坐標的信息呢叙淌?系統(tǒng)或默認設(shè)置為早上6點鐘為日出秤掌,下午10點為日落。用戶調(diào)整系統(tǒng)時間鹰霍,當前的主題也會隨之改變闻鉴。如果我們不希望用戶在設(shè)定主題后,主題還會隨著時間改變,MODE_NIGHT_AUTO就不適用了茂洒。
代碼參考:
https://git.oschina.net/hcj/lerannightmode_support_lib.git
https://github.com/TonnyL/PaperPlane

2孟岛、使用activity中的setTheme方式實現(xiàn)

3、換膚框架

github上很多類似的換膚框架,其實現(xiàn)方式:

1)基于theme的內(nèi)部資源加載蚀苛,使用setTheme切換)在验,第二種方式相同。
2)利用View的Tag:

代表框架:AndroidChangeSkin堵未,通過View的Tag來存儲夜間模式的Drawable/Color引用
多套皮膚使用相同名稱加不同后綴來區(qū)分腋舌,假設(shè)文本顏色item_text_color有一套默認皮膚,一套綠色皮膚一套紅色皮膚渗蟹,則要定義三個資源item_text_color块饺,item_text_color_red,item_text_color_green雌芽。
優(yōu)點:Android支持度高
缺點:需要自定義Tag授艰;部分View的Tag被其他邏輯占用
舉例:

<TextView  
    android :layout_width="wrap_content"  
    android :layout_height="wrap_content"  
    android :tag="skin:item_text_color:textColor"  
    android :text="@string/hello_world"  
    android :textColor="@color/item_text_color"/>  

3)自定義View(在setTheme后遍歷并立刻刷新View),自定義View來實現(xiàn)主題切換世落,在XML內(nèi)全部使用自定義的View淮腾,當需要切換主題時使用監(jiān)聽器或者eventbus來通知所有的view來切換其樣式。

代表框架:MultipleTheme
優(yōu)點:靈活性比較高屉佳,每類View都可以自己決定如何支持夜間模式
缺點:對代碼的侵入性較大谷朝,xml和java代碼都有不小的改動

4)動態(tài)資源替換

代表框架:AndroidSkinLoader
實現(xiàn)原理:
AndroidSkinLoader利用的是2.3節(jié)中談到的代理LayoutInflater的onCreateView過程來創(chuàng)建View的原理,在創(chuàng)建View的過程中將View的backgound/textColor等屬性的值取出武花,并與View一起存到列表內(nèi)圆凰,在切換皮膚時遍歷列表,通過對原始id/屬性值做轉(zhuǎn)化体箕,找到當前皮膚對應的資源id/屬性值专钉,刷新View。
優(yōu)點:對現(xiàn)有布局和java代碼影響比較小
缺點:皮膚文件在新的apk包內(nèi)累铅,框架需要單獨下載跃须,然后加載新的apk包來換膚。
舉例:

<TextView  
    android :id="@+id/detail_text"  
    android :layout_width="wrap_content"  
    android :layout_height="wrap_content"  
    android :lineSpacingExtra="6sp"  
    android :layout_margin="10dp"  
    skin :enable="true"  
    android :textSize="18sp"  
    android:textColor="@color/color_new_item_synopsis" />  

參考:
http://blog.csdn.net/u013478336/article/details/52484322
http://blog.csdn.net/u013478336/article/details/53083054

QSkinLoader

一個支持多種場景的Android換膚框架娃兽』亓基本原理是通過代理LayoutInflater的View創(chuàng)建過程解析皮膚相關(guān)屬性(background/src/textColor等),將皮膚相關(guān)屬性設(shè)置到View的Tag內(nèi)换薄,在切換皮膚時尋找對應的皮膚來完成實時刷新動作玉雾。

優(yōu)勢:
  • 代碼及XML侵入性小
  • 功能完善(支持Activity/Dialog/懸浮窗/PopWindow/Fragment等)
  • 無需重啟Activity
  • 支持自定義屬性換膚、同時支持資源內(nèi)換膚和獨立資源包(下載后換膚)等優(yōu)點
    詳細介紹:
    http://blog.csdn.net/u013478336/article/details/53083054
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末轻要,一起剝皮案震驚了整個濱河市复旬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冲泥,老刑警劉巖驹碍,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壁涎,死亡現(xiàn)場離奇詭異,居然都是意外死亡志秃,警方通過查閱死者的電腦和手機怔球,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浮还,“玉大人竟坛,你說我怎么就攤上這事【啵” “怎么了担汤?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洼冻。 經(jīng)常有香客問我崭歧,道長,這世上最難降的妖魔是什么撞牢? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任率碾,我火速辦了婚禮,結(jié)果婚禮上屋彪,老公的妹妹穿的比我還像新娘所宰。我一直安慰自己,他們只是感情好撼班,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布歧匈。 她就那樣靜靜地躺著垒酬,像睡著了一般砰嘁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勘究,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天矮湘,我揣著相機與錄音,去河邊找鬼口糕。 笑死缅阳,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的景描。 我是一名探鬼主播十办,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼超棺!你這毒婦竟也來了向族?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤棠绘,失蹤者是張志新(化名)和其女友劉穎件相,沒想到半個月后再扭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡夜矗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年泛范,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片紊撕。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡罢荡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逛揩,到底是詐尸還是另有隱情柠傍,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布辩稽,位于F島的核電站惧笛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逞泄。R本人自食惡果不足惜患整,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喷众。 院中可真熱鬧各谚,春花似錦、人聲如沸到千。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽憔四。三九已至膀息,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間了赵,已是汗流浹背潜支。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留柿汛,地道東北人冗酿。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像络断,于是被迫代替她去往敵國和親裁替。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

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

  • 前言: 本文主要講述如何在項目中貌笨,在不重啟應用的情況下弱判,實現(xiàn)動態(tài)換膚的效果。換膚這塊做的比較好的躁绸,有網(wǎng)易云音樂裕循,q...
    Yagami3zZ閱讀 13,623評論 5 51
  • 之前寫了一個android夜間模式的框架臣嚣,只能修改黑夜和白天。但需求總是不輕易滿足現(xiàn)狀剥哑,隨隨便便就能整出一個動態(tài)換...
    初見破曉閱讀 1,475評論 4 4
  • 話說什么是動態(tài)換膚?這里舉個例子:在APP中可以下載某一個皮膚包硅则,然后應用起來整個APP的界面就發(fā)生了改變,諸如某...
    carlwu_186閱讀 3,585評論 4 13
  • 慚愧有時是一種自我安慰株婴。 比如在相對充實的今天怎虫,想發(fā)個說說配些美圖和美句。卻不想弄錯了某個詞困介,說說已發(fā)出1個小時大审,...
    米盧諾閱讀 255評論 0 0
  • 一般來說徒扶,任何工作都有其普適的工作流程,內(nèi)部審計也不例外根穷。盡管目前內(nèi)部審計工作并未形成類似財務(wù)工作那么嚴謹?shù)墓ぷ饕?guī)...
    一品課堂閱讀 712評論 0 0