android 夜間模式實現

最近項目須要須要實現 夜間模式功能,大體有兩種實現方式:android

  1. 設置日間、夜間兩套theme,使用 setTheme 的方法讓 Activity 設置主題;
  2. 經過Android Support Library:appcompat 包 中的 UiMode 來支持日間/夜間模式的切換(v23以後纔有日間、夜間模式)

方法一須要對原有全部佈局文件進行修改,工做量巨大,不適應於目前咱們這種已經作了好久的項目,因此決定用第二種方式,具體實現步驟以下: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 方法重啓頁面。

相關文章
相關標籤/搜索