Android Support Library 之 夜間模式

bozin 8年前發布 | 16K 次閱讀 安卓開發 Android開發 移動開發

前言

夜間模式實現方式

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

 

閱讀原文

 

 本文由用戶 bozin 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!