Android Support Library 之 夜間模式
前言
夜間模式實現方式
1、通過切換theme來實現夜間模式。
優點:可以匹配多套主題,并不局限于黑白模式
缺點:需要大量定義主題
詳見博客: http://wuxiaolong.me/2015/08/19/ChangeTheme/
2、通過修改uiMode來切換夜間模式。修改uimode是修改Configuration,這種主題切換只限于黑白模式,沒有其他模式,即本文介紹的內容。
效果預覽
如何使用
第一步
(1)app/build.gradle
compile 'com.android.support:appcompat-v7:24.0.0'
(2)Activity須繼承AppCompatActivity
(3)Theme.AppCompat.DayNight
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
第二步
應用全局主題推薦在 Application 的onCreate()中進行設置AppCompatDelegate.setDefaultNightMode(int mode);
它有四個可選值,分別是:
MODE_NIGHT_NO: 使用亮色(light)主題,不使用夜間模式
MODE_NIGHT_YES:使用暗色(dark)主題,使用夜間模式
MODE_NIGHT_AUTO:根據當前時間自動切換 亮色(light)/暗色(dark)主題
MODE_NIGHT_FOLLOW_SYSTEM(默認選項):設置為跟隨系統,通常為 MODE_NIGHT_NO
第三步
動態的設定主題,需要切換主題調用:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
//調用recreate()使設置生效
recreate();
注意事項
setDefaultNightMode()與setLocalNightMode()區別
AppCompatDelegate.setDefaultNightMode()是對整個App中theme為DayNight主題生效getDelegate().setLocalNightMode()只對特定的組件生效
夜間資源
把夜晚主題的color等資源放在values-night中,程序在運行時就會自動調用
獲取應用當前的主題
int currentNightMode = getResources().getConfiguration().uiMode
& Configuration.UI_MODE_NIGHT_MASK;
switch (currentNightMode) {
case Configuration.UI_MODE_NIGHT_NO:
// Night mode is not active, we're in day time
case Configuration.UI_MODE_NIGHT_YES:
// Night mode is active, we're at night!
case Configuration.UI_MODE_NIGHT_UNDEFINED:
// We don't know what mode we're in, assume notnight
}
如果切換了主題,本想通過這個方法,下次啟動程序的時候,來設置。發現并沒有記住這個值,還是只能SharedPreference讀取,然后根據用戶設置,調用 setDefaultNightMode() 方法。
適配文字圖片
盡可能的使用主題屬性(theme attributes)
-
android:textColor=”?android:attr/textColorPrimary” 或者android:textColor=”?android:textColorPrimary”系統默認的文字顏色。在亮色(light)主題下,顏色接近黑色,在暗色(dark)主題下,顏色接近白色。
-
android:background=”?android:colorBackground”系統默認的背景顏色
-
?attr/colorControlNormal. 系統默認的圖標顏色
源碼地址
https://github.com/WuXiaolong/DesignSupportLibrarySample