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主題。如圖:

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

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

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

沒啥說的,也白天對應(yīng)。
1.3 如何引用我們自定義theme的屬性
控件引用我們自定義的屬性的格式:
android:需要修改的屬性="?attr/屬性名稱"
如圖:

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è)置。
如圖:

1.7 其他
- 用戶進(jìn)行夜間主題的切換代碼如下:
getDelegate().setLocalNightMode(MODE_NIGHT_YES);
recreate();
主要是這個recreate(),此方法會使Activity重新加載,可能會使我們之前的變量值為空等,這也是很多人吐槽的地方。
- 如果你的頁面中存在webview加載,你應(yīng)該盡可能使webview加載的頁面和你的主題相符這樣用戶體驗好點(diǎn)。
行了,今天就說這么多!