Android-日夜主題切換(google推薦)
android日夜間模式切換相比大家都接觸過,我之前也經常用,但今天想給大家推薦一個google推薦的實現方式,實現起來比較簡單, 就是咱們今天的主角主題-----Theme.AppCompat.DayNight 。
Theme.AppCompat.DayNight在Support Library 23以後也就是6.0出現,支援API 14及以上,我相信現在已經不存在低於API14的手機了吧。 這個主題可以根據系統時間自動切換 Theme.AppCompat(暗色) 和 Theme.AppCompat.Light(亮色) 兩種主題,注意是自動切換。早上6點到晚上10點是亮色主題,晚上10點到早上6點是暗色主題 ,在 API v14 以下的裝置則會預設使用亮色的主題。
1.如何使用Theme.AppCompat.DayNight。
1.1 首先呢,要我們的主題繼承自Theme.AppCompat.DayNight主題。如圖:

image.png
然後再我們的功能清單檔案引用我們的主題就行:

image.png
1.2 建立一個叫value-night的資原始檔夾,裡面可以包括color,string,sytle等資原始檔,與project自帶的value對應。

image.png
聰明的小夥伴已經猜出來了,這value資料夾下的sytle是我們白天模式的style,而value-night下的sytle則是我們夜間模式的style.而value-night下color資料夾則是我們定義的夜間模式的顏色資訊,同樣我們還可以定義其他相關的資料夾。我們看一眼夜間模式我們定義的color顏色:

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

image.png
1.4如何切換我們的白夜主題
我們設定好了白天和夜間的主題檔案,那如何切換呢?
//設定為夜間模式,可直接呼叫 getDelegate().setLocalNightMode(MODE_NIGHT_YES); recreate(); //設定為白天模式 getDelegate().setLocalNightMode(MODE_NIGHT_NO); recreate();
1.5 如何監聽我們當前的主題
程式碼如下
int uiMode = getResources().getConfiguration().uiMode; dayNightUiMode = uiMode & Configuration.UI_MODE_NIGHT_MASK; if (dayNightUiMode == Configuration.UI_MODE_NIGHT_NO) { btnTheme.setText("當前是亮色主題"); dayNightUiMode=1; } else if (dayNightUiMode == Configuration.UI_MODE_NIGHT_YES) { btnTheme.setText("當前是暗色主題"); dayNightUiMode=2; } else { btnTheme.setText("當前是自動主題"); }
1.6 使用者設定夜間主題,下次進入app之前的會自動儲存不?
很遺憾不會。對待這個問題, 我們通常就是將使用者設定的主題儲存到SharedPreference中,每次進入app都先查詢使用者儲存的主題,然後在BaseApplication中呼叫 AppCompatDelegate.setDefaultNightMode()重新設定。
如圖:

image.png
1.7 其他
- 使用者進行夜間主題的切換程式碼如下:
getDelegate().setLocalNightMode(MODE_NIGHT_YES); recreate();
主要是這個recreate(),此方法會使Activity重新載入,可能會使我們之前的變數值為空等,這也是很多人吐槽的地方。
-
如果你的頁面中存在webview載入,你應該儘可能使webview載入的頁面和你的主題相符這樣使用者體驗好點。
行了,今天就說這麼多!