Android-日夜主題切換(google推薦)

android日夜間模式切換相比大家都接觸過,我之前也經(jīng)常用,但今天想給大家推薦一個google推薦的實現(xiàn)方式,實現(xiàn)起來比較簡單,就是咱們今天的主角主題-----Theme.AppCompat.DayNight

Theme.AppCompat.DayNight在Support Library 23以后也就是6.0出現(xiàn),支持API 14及以上,我相信現(xiàn)在已經(jīng)不存在低于API14的手機(jī)了吧。這個主題可以根據(jù)系統(tǒng)時間自動切換 Theme.AppCompat(暗色) 和 Theme.AppCompat.Light(亮色) 兩種主題,注意是自動切換。早上6點(diǎn)到晚上10點(diǎn)是亮色主題,晚上10點(diǎn)到早上6點(diǎn)是暗色主題,但如果你想更加精確,需要提供坐標(biāo)權(quán)限,在 API v14 以下的設(shè)備則會默認(rèn)使用亮色的主題。
需要提供的坐標(biāo)權(quán)限如下:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

1.如何使用Theme.AppCompat.DayNight。

1.1 首先呢,要我們的主題繼承自Theme.AppCompat.DayNight主題。如圖:
image.png

然后再我們的功能清單文件引用我們的主題就行:


image.png
1.2 建立一個叫value-night的資源文件夾,里面可以包括color,string,sytle等資源文件,與project自帶的value對應(yīng)。
image.png

聰明的小伙伴已經(jīng)猜出來了,這value文件夾下的sytle是我們白天模式的style,而value-night下的sytle則是我們夜間模式的style.而value-night下color文件夾則是我們定義的夜間模式的顏色信息,同樣我們還可以定義其他相關(guān)的文件夾。我們看一眼夜間模式我們定義的color顏色:


image.png

沒啥說的,也白天對應(yīng)。

1.3 如何引用我們自定義theme的屬性

控件引用我們自定義的屬性的格式:

android:需要修改的屬性="?attr/屬性名稱"

如圖:


image.png
1.4如何切換我們的白夜主題

我們設(shè)置好了白天和夜間的主題文件,那如何切換呢?

                    //設(shè)置為夜間模式,可直接調(diào)用
                  getDelegate().setLocalNightMode(MODE_NIGHT_YES);
recreate();

                 //設(shè)置為白天模式
                    getDelegate().setLocalNightMode(MODE_NIGHT_NO);
recreate();
1.5 如何監(jiān)聽我們當(dāng)前的主題

代碼如下

    int uiMode = getResources().getConfiguration().uiMode;
         dayNightUiMode = uiMode & Configuration.UI_MODE_NIGHT_MASK;

        if (dayNightUiMode == Configuration.UI_MODE_NIGHT_NO) {
            btnTheme.setText("當(dāng)前是亮色主題");
            dayNightUiMode=1;

        } else if (dayNightUiMode == Configuration.UI_MODE_NIGHT_YES) {
            btnTheme.setText("當(dāng)前是暗色主題");
            dayNightUiMode=2;

        } else {
            btnTheme.setText("當(dāng)前是自動主題");
        }
1.6 用戶設(shè)置夜間主題,下次進(jìn)入app之前的會自動保存不?

很遺憾不會。對待這個問題,我們通常就是將用戶設(shè)置的主題保存到SharedPreference中,每次進(jìn)入app都先查詢用戶保存的主題,然后在BaseApplication中調(diào)用 AppCompatDelegate.setDefaultNightMode()重新設(shè)置。
如圖:

image.png

1.7 其他
  • 用戶進(jìn)行夜間主題的切換代碼如下:
  getDelegate().setLocalNightMode(MODE_NIGHT_YES);
  recreate();

主要是這個recreate(),此方法會使Activity重新加載,可能會使我們之前的變量值為空等,這也是很多人吐槽的地方。

  • 如果你的頁面中存在webview加載,你應(yīng)該盡可能使webview加載的頁面和你的主題相符這樣用戶體驗好點(diǎn)。
    行了,今天就說這么多!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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