android 夜間模式(換膚)總結(jié)

一羡棵、android 平臺常見的換膚方案.

Android 平臺常見的額換膚方式總結(jié)起來有如下三種:

1.設(shè)置setTheme 主題來切換金抡。

  • 原理:通過在values文件夾下的attrs.xml和style.xml文件中配置不同的風(fēng)格的主題敢朱,在Activity中的onCreate()方法中位喂,調(diào)用setContentView()方法前調(diào)用setTheme()方法來設(shè)置主題疗垛。
  • 優(yōu)點:利用系統(tǒng)自帶的機(jī)制實現(xiàn)挠阁,根據(jù)標(biāo)志位setTheme()即可宾肺。
  • 缺點:在主題切換界面不重啟的情況下,不能自動完成界面主題的刷新侵俗。笨重锨用,靈活性較低,不易于擴(kuò)展隘谣。
  • 例如:
    android 設(shè)置自定義主題及切換方案

2.借助于第三方庫完成換膚

  • 原理:LayoutInflater有一個內(nèi)部接口Factory黔酥,系統(tǒng)會使用它去做XML到View的轉(zhuǎn)換,而系統(tǒng)也提供了setFactory的方法洪橘,用戶設(shè)置了跪者,則用我們設(shè)置的,這樣系統(tǒng)就會走我們Factory的onCreateView,他會返回一個我們定制化的View熄求。
  • 優(yōu)點:不用重啟activity渣玲,不閃屏;可以為程序提供多種皮膚方案不局限于夜間/白天模式弟晚。
  • 缺點:在制作方面代價過大忘衍,侵入性較強(qiáng)逾苫,需要以來第三方庫完成,可靠性不能得到保證枚钓。
  • 例如:
    ChangeSkin
    Android-skin-support

3:使用DayNight主題實現(xiàn)來支持日間/夜間模式的切換

  • 優(yōu)點:Google自家產(chǎn)品铅搓,可靠性高,配置簡單搀捷,省心省力星掰,在僅僅需要實現(xiàn)夜間/日間模式的應(yīng)用內(nèi)強(qiáng)烈推薦。
  • 缺點:不支持多皮膚切換嫩舟,只支持日間模式和夜間模式氢烘。

二.官方DayNight主題方案實現(xiàn)

1.導(dǎo)入依賴

implementation 'androidx.appcompat:appcompat:1.0.2'

2.修改style文件

<style name="AppTheme" parent="Theme.AppCompat.DayNight">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/color_blue</item>
 </style>

在這里需要將主題改為Theme.AppCompat.DayNight 或者它的子主題。只有這樣才支持白夜模式的切換家厌。
這會將應(yīng)用程序的主題與系統(tǒng)控制的夜間模式標(biāo)志相關(guān)聯(lián)播玖,當(dāng)系統(tǒng)的主題切換時,應(yīng)用也會隨之切換主題饭于。

3.新增夜間模式下的color文件

既然App需要在白夜模式下互相切換蜀踏,就需要兩套的顏色資源文件和圖片資源文件。
顏色資源文件
原有的color.xml文件內(nèi)的顏色系統(tǒng)默認(rèn)作為白天模式下的顏色取值掰吕。對于夜間模式脓斩,我們需要新增values-night文件夾,里面包含一個新建的color文件
圖片資源文件
如果適配圖片的話畴栖,就創(chuàng)建對應(yīng)的 drawable-night-xxhdpi目錄,mipmap-night-xxhdpi目錄然后將圖片資源放到對應(yīng)的目錄里面八千。

在這個文件中的顏色名需與默認(rèn)的color文件內(nèi)顏色名一一對應(yīng)

//默認(rèn)的color文件內(nèi)顏色值
<color name="color_1">#f2f2f2</color>
<color name="color_2">#8E8E93</color>
<color name="color_3">#3385FF</color>
//values-night 內(nèi)的color文件內(nèi)顏色值
<color name="color_1">#616161</color>
<color name="color_2">#E0E0E0</color>
<color name="color_3">#E0E0E0</color>

4.切換模式

開始前我們要確保我們的Activity繼承自AppCompatActivity.
兩種方法:
第一種:調(diào)用AppCompatActivity里的getDelegate()獲取AppCompatDelegate對象吗讶,然后在調(diào)用setLocalNightMode()方法設(shè)置夜間模式

if(isNi) {  
getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);  
} else {  
getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);  
}  

第二種:在onCreate()方法里的setContentView()方法前,直接調(diào)用AppCompatActivity里的靜態(tài)方法setDefaultNightMode()來設(shè)置

//日間 切換 夜間
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
recreate()

//夜間 切換 日間  
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
recreate()

兩種方法的區(qū)別
第一種方法是立刻生效的恋捆,且只在當(dāng)前Activity有效照皆,代碼執(zhí)行之后會重新創(chuàng)建當(dāng)前Activity;而第二種方法是在Activity被創(chuàng)建的時候生效沸停,且對App內(nèi)的所有Activity都生效膜毁。

使用上述兩種方案就完成了切換。當(dāng)然這樣切換是很生硬的愤钾,沒有過渡動畫瘟滨,看起來不是很舒服 我們可以在recreate()之前給它加個過渡動畫.

getWindow().setWindowAnimations(R.style.OutInAnimation);

AppCompatDelegate一共有四種模式:

  • MODE_NIGHT_NO. Always use the day (light) theme(一直應(yīng)用日間(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ù)當(dāng)前時間在day/night主題間切換).自動模式,當(dāng)我們的APP有網(wǎng)絡(luò)及定位權(quán)限時能颁。系統(tǒng)會根據(jù)當(dāng)?shù)氐臅r間判斷當(dāng)前時處于白天還是黑夜杂瘸,從而自動加載不同的模式。
  • MODE_NIGHT_FOLLOW_SYSTEM(默認(rèn)選項). This setting follows the system’s setting, which is essentially MODE_NIGHT_NO(跟隨系統(tǒng)伙菊,通常為MODE_NIGHT_NO).

當(dāng)我們的App啟動時就需要顯示為夜間模式時败玉,我們可以在Application內(nèi)設(shè)置

class BaseApplication : Application() {
static {
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
}
    override fun onCreate() {
        super.onCreate()
}

但一般情況下敌土,我們都會在切換模式時將當(dāng)前模式保存至本地,下次啟動時再根據(jù)保存的值加載不同的模式

class BaseApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        if (SPManager.getBoolean(applicationContext, SPContent.SP_MODE, false)) 
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) else 
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
    }
}

5.注意

  • 1.切換只作用于新生成的組件运翼,對原先處于任務(wù)棧中的Activity不起作用返干。(解決方法:發(fā)送廣播,讓它重啟)如果直接在Activity的onCreate()中調(diào)用切換代碼血淌,可以不需要調(diào)用recreate()矩欠。對于一些數(shù)據(jù)的保存與切換后的顯示我們可以用savedInstanceState來保存與復(fù)原

  • 2.在切換后可以不調(diào)用recreate(),而是自己添加一個重啟該Activity的方法六剥,然后加個過度動畫

  • 3.解決動態(tài)切換主題時activity重啟閃屏的問題:NightModel

感謝:
Android 10適配要點晚顷,深色主題-郭霖
android夜間模式淺析
一種Android換膚機(jī)制的實現(xiàn)

最后編輯于
?著作權(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)我...
    茶點故事閱讀 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日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年始锚,在試婚紗的時候發(fā)現(xiàn)自己被綠了刽酱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞧捌,死狀恐怖棵里,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姐呐,我是刑警寧澤殿怜,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站皮钠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏赠法。R本人自食惡果不足惜麦轰,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砖织。 院中可真熱鬧款侵,春花似錦、人聲如沸侧纯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眶熬。三九已至妹笆,卻和暖如春块请,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拳缠。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工墩新, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窟坐。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓海渊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哲鸳。 傳聞我的和親對象是個殘疾皇子臣疑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355