實(shí)現(xiàn)思路
使用Android SDK Support Library23.2 自帶的DayNight Theme來實(shí)現(xiàn)白天黑夜的切換,
1.更改theme為Theme.AppCompat.DayNight.--------------

2.在res目錄下創(chuàng)建對(duì)應(yīng)的黑夜資源values-night,drawable-night文件夾,然后新建對(duì)應(yīng)的黑夜資源文件:顏色、圖片等,切換黑夜模式后,系統(tǒng)會(huì)自動(dòng)讀取文件夾中的資源

3.在Java代碼中控制主題,
首先因?yàn)檫@個(gè)功能來自support-appcompat,所以我們的Activity是繼承的AppCompatActivity的。
下面的三種模式都可以用在初始化、或者顯式調(diào)用:
第一種,自動(dòng)模式,如果我們app有定位權(quán)限、網(wǎng)絡(luò)權(quán)限等,系統(tǒng)可以自動(dòng)確實(shí)現(xiàn)在是晚上還是白天,當(dāng)用戶打開APP時(shí)會(huì)自動(dòng)切換到響應(yīng)的模式,這個(gè)模式我們可以在APP初始化或者Application中用一個(gè)靜態(tài)代碼快來設(shè)置:
1.在Application中進(jìn)行初始化
public class MyApplication extends Application{
static {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
}
@Override
public void onCreate() {
super.onCreate();
}
}
2.在初始化時(shí)設(shè)置模式,但是必須在setContentView(),之前設(shè)置
第二種,日間模式,調(diào)用后需要調(diào)用Activity的recreate()方法:
getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);
recreate();
//或者
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
recreate();
第三種,夜間模式,調(diào)用后需要調(diào)用Activity的recreate()方法:
getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);
recreate();
//或者
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
recreate();
如何獲取當(dāng)前主題的狀態(tài)
int currentNightMode = getResources().getConfiguration().uiMode &Configuration.UI_MODE_NIGHT_MASK;
case Configuration.UI_MODE_NIGHT_NO: //黑夜模式
case Configuration.UI_MODE_NIGHT_YES://白天模式
case Configuration.UI_MODE_NIGHT_UNDEFINED://未定義
可以通過上面面的幾種狀態(tài)來進(jìn)行相應(yīng)的操作如:
int currentNightMode = getResources().getConfiguration().uiMode
& Configuration.UI_MODE_NIGHT_MASK;
switch (currentNightMode) {
case Configuration.UI_MODE_NIGHT_NO:
getDelegate().setDefaultNightMode(
AppCompatDelegate.MODE_NIGHT_YES);
break;
case Configuration.UI_MODE_NIGHT_YES:
getDelegate().setDefaultNightMode(
AppCompatDelegate.MODE_NIGHT_NO);
break;
case Configuration.UI_MODE_NIGHT_UNDEFINED:
getDelegate().setDefaultNightMode(
AppCompatDelegate.MODE_NIGHT_AUTO);
break;
}
// 調(diào)用 recreate() 使設(shè)置生效
recreate();
}
注意:在更改切換同主題模式之后,需要調(diào)用 recreate(),在重啟,但是此時(shí)界面的狀態(tài)會(huì)丟失,所以當(dāng)狀態(tài)改變時(shí)需要對(duì)其進(jìn)行保存 ,在重建之后進(jìn)行恢復(fù)-----onSaveInstanceState(Bundle outState)----onCreate(Bundle savedInstanceState)