說在前面
日夜間模式在app上面的體驗(yàn)不必多說,特別是晚上康嘉,所以這玩意兒是個(gè)好東西碉输,民間版本的夜間模式實(shí)現(xiàn)效果都很友好,但是都很復(fù)雜亭珍。官方在Android Support Library 23.2開始支持了夜間模式切換敷钾,所以大家伙兒不妨試試?
上代碼?DayNightDemo
上效果
我是圖
實(shí)踐
1.關(guān)于gradle依賴就不多說了块蚌,新建項(xiàng)目就會(huì)依賴
compile'com.android.support:appcompat-v7:24.2.1'
2.切換主題的activity必須繼承自AppCompatActivity
3.使用的主題闰非,把Theme.AppCompat.DayNight作為parent:
4.新建value-night文件夾,在此文件夾中準(zhǔn)備另一套colors和styles峭范。里面的名字跟對(duì)應(yīng)的value下名字相同财松,只是值不同,這樣系統(tǒng)就會(huì)自動(dòng)獲取對(duì)應(yīng)的值了
5.代碼部分,想要切換的地方調(diào)用:
getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);//切換夜間模式recreate();//重新啟動(dòng)當(dāng)前
activitygetDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);//切換日間模式recreate();//重新啟動(dòng)當(dāng)前activity
6.setLocalNightMode的值的說明:
MODE_NIGHT_NO: 使用亮色(light)主題,不使用夜間模式
MODE_NIGHT_YES:使用暗色(dark)主題辆毡,使用夜間模式
MODE_NIGHT_AUTO:根據(jù)當(dāng)前時(shí)間自動(dòng)切換 亮色(light)/暗色(dark)主題
MODE_NIGHT_FOLLOW_SYSTEM(默認(rèn)選項(xiàng)):設(shè)置為跟隨系統(tǒng)菜秦,通常為MODE_NIGHT_NO
7.補(bǔ)充一下,如何記錄上一次設(shè)置的狀態(tài)舶掖,可以用sp記錄狀態(tài)然后進(jìn)來的application時(shí)候就讀取球昨,具體代碼沒有,就是任性眨攘!
8.補(bǔ)充兩下主慰,我看到很多人說這種模式切換會(huì)閃屏,怎么優(yōu)化鲫售?先解釋一下閃屏原因共螺,因?yàn)楸仨氄{(diào)用recreate方法才能行,也就是說這里的activity重繪了情竹,圖中EditText里面的Hint信息也變化了藐不,所以顯得兩個(gè)activity之間切換生硬,所以這里對(duì)切換主題的activity設(shè)置一個(gè)切換動(dòng)畫就行了秦效,效果就是上面的圖
@android:style/Animation.Toast
估計(jì)這個(gè)是大家最需要的雏蛮。。阱州。挑秉。
9.還有人問到ToolBar中的相關(guān)東西怎么修改,這里只說右上角那三個(gè)點(diǎn)的menu打開后的背景修改贡耽,因?yàn)槲以谶@里卡了一下衷模,呃:
@color/bg_content
具體更多的關(guān)于ToolBar的移步:
總結(jié)
主題模式這個(gè)東西涉及的資源本身就很多,需要把每個(gè)需要修改的都記錄蒲赂,以便替換另一套修改方案阱冶,從另一方面要求了必須把那些資源文件放在value文件夾統(tǒng)一管理,也算是強(qiáng)行糾正一些習(xí)慣滥嘴。