實現(xiàn)思路
使用Android SDK Support Library23.2 自帶的DayNight Theme來實現(xiàn)白天黑夜的切換彰居,
1.更改theme為Theme.AppCompat.DayNight.--------------
2.在res目錄下創(chuàng)建對應(yīng)的黑夜資源values-night,drawable-night文件夾诚纸,然后新建對應(yīng)的黑夜資源文件:顏色、圖片等陈惰,切換黑夜模式后畦徘,系統(tǒng)會自動讀取文件夾中的資源
3.在Java代碼中控制主題,
首先因為這個功能來自support-appcompat抬闯,所以我們的Activity是繼承的AppCompatActivity的井辆。
下面的三種模式都可以用在初始化、或者顯式調(diào)用:
第一種溶握,自動模式杯缺,如果我們app有定位權(quán)限、網(wǎng)絡(luò)權(quán)限等奈虾,系統(tǒng)可以自動確實現(xiàn)在是晚上還是白天夺谁,當(dāng)用戶打開APP時會自動切換到響應(yīng)的模式,這個模式我們可以在APP初始化或者Application中用一個靜態(tài)代碼快來設(shè)置:
1.在Application中進行初始化
public class MyApplication extends Application{
static {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
}
@Override
public void onCreate() {
super.onCreate();
}
}
2.在初始化時設(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)來進行相應(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()奴愉,在重啟,但是此時界面的狀態(tài)會丟失铁孵,所以當(dāng)狀態(tài)改變時需要對其進行保存 锭硼,在重建之后進行恢復(fù)-----onSaveInstanceState(Bundle outState)----onCreate(Bundle savedInstanceState)