最近項目須要須要實現 夜間模式功能,大體有兩種實現方式:android
方法一須要對原有全部佈局文件進行修改,工做量巨大,不適應於目前咱們這種已經作了好久的項目,因此決定用第二種方式,具體實現步驟以下:app
1、添加依賴包:佈局
compile 'com.android.support:appcompat-v7:24.2.1'
二 、在application 中初始化uimode 模式:ui
public void onCreate() { // TODO Auto-generated method stub super.onCreate(); initThemeMode();
經過Sharedpreferences 記錄上一次設置的模式this
private void initThemeMode() { if (!Constants.enableNightModel) return; isNight = SharedpreferencesUtil.isNightMode(this); if (isNight) { //夜間模式 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); } else { //白天模式 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); } }
供settingactivity 調用的設置日/夜模式方法圖片
public void setTheme(AppCompatActivity activity, boolean mode,boolean recreate) { if (!Constants.enableNightModel) return; if (isNight == mode) { return; } if (!mode) { //白天模式 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); activity.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO); } else { //白天模式 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); activity.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES); } isNight = mode; SharedpreferencesUtil.saveNightMode(this,isNight); if (recreate){ activity.recreate(); } }
3、設置日間、夜間模式對應的 color/ drawable資源
3.1 設置兩套colorget
color 中的顏色值名稱要相同it
如 日間模式 T5表明白色io
夜間模式T5代碼 灰黑色
原佈局文件中的顏色引用不用改動
注意: 好比有個顏色值
<color name="A1">#FF3232</color>
values中color含有A1, values-night中color中沒有A1,日間夜間模式都能正常訪問,夜間模式下會讀取 日間模式中的顏色值
但反過來,values-night中color中有A1,values中color沒有A1,夜間模式正常,日間模式崩潰
3.2設置 圖片資源
將相應模式下的圖片放入相應的文件夾下,圖片名稱要一致
四,設置頁面中設置日、夜間模式
private void setNightMode(boolean nightMode) { MyApplication.getInstance().setTheme(context, nightMode, false); }
此方式僅對新打開頁面有效,已打開的頁面 須要調用 recreate 方法重啓頁面。