白天夜間模式切換

實(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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,889評(píng)論 25 709
  • 夢(mèng)里不見你,目空 黑,是整個(gè)世界的主調(diào) 看不見那把黑色的刀 是如何扎進(jìn)最疼的地方 我用手來觸摸唯一的溫度 嗯,暖暖...
    小學(xué)期閱讀 268評(píng)論 0 0
  • 文/胡椒 百度百科里說,友誼是一種來自雙向關(guān)系的情感,即雙方共同凝結(jié)的情感,任何單方面的示好,不能稱為友誼。 除了...
    胡姣姣閱讀 1,082評(píng)論 4 2
  • 前面一個(gè)文章,寫了一個(gè)內(nèi)置組件并且可以自由定義的組件后,原理就是內(nèi)置了兩個(gè)軟件方法,可以根據(jù)prop傳進(jìn)去的值進(jìn)行...
    MakingChoice閱讀 356評(píng)論 0 0
  • 圖片發(fā)自簡(jiǎn)書App 今日做下的事: 早上跑步,下午練雙截棍,傍晚練散打。 維拉斯帶訓(xùn),二田武協(xié)帶訓(xùn)。 閱讀一篇專欄...
    文建偉CZYH閱讀 321評(píng)論 0 1

友情鏈接更多精彩內(nèi)容