1. 程式人生 > >android 快速實現夜間模式

android 快速實現夜間模式

最近專案中遇到了一個問題,夜間模式在8.0以上的手機中不起作用,查看了一下原因,是夜間模式實現方法的問題。分兩種情況介紹一下

先看一下執行效果:

第一種 是目前專案中用到的,是以前的開發人員寫的,存在一些問題(不相容8.0以上的版本),已解決

第二種是Support Library 中自帶的一種方法。

 

第一種:

第一步 需要新增夜間模式資源,以-night為字尾

日間模式                    對應                  夜間模式

drawable                                              drawable-night

values                                                     values-night

drawable-hdpi                                     drawable-night-hdpi

。。。

目錄結構如下:

例如:color 的色值:在不同的value 下,命名相同,但是色值可以隨意設定,適應不同的模式

圖片,邊框樣式等也是一樣的道理。

第二步 在application 中新增 切換方法:

public class MyApplication extends Application {
    private static Resources sRes;
    @Override
    public void onCreate() {
        super.onCreate();
        init(this);
    }
    public static void init(Context context) {
        sRes = context.getResources();
    }
    /**
     * 切換 夜間模式
     * @param on true 夜間, false  日間
     */
    public static void updateNightMode(boolean on) {
        DisplayMetrics dm = sRes.getDisplayMetrics();
        Configuration config = sRes.getConfiguration();
        config.uiMode &= ~Configuration.UI_MODE_NIGHT_MASK;
        config.uiMode |= on ? Configuration.UI_MODE_NIGHT_YES : Configuration.UI_MODE_NIGHT_NO;
        sRes.updateConfiguration(config, dm);
    }
}

第三步 呼叫方法修改主題:

 MyApplication.updateNightMode( false/true );  // 需要儲存當前主題的狀態。根據狀態,進行切換

切換完後 重新整理 

recreate();// 會有閃屏,可以使用下面的方法

或者

finish();
startActivity(new Intent( this, this.getClass()));
overridePendingTransition(0, 0);

注意:以上方法只適合 8.0以下的手機,需要相容的話,就需要用到第二種方法了

 

第二種:

使用Support Library 23.2中新新增的夜間模式主題,並且可以向下相容最低api 14的,基本滿足絕大多數的手機。

介紹:

設定 當前的模式

        AppCompatDelegate.setDefaultNightMode(int mode);

它有四個可選值,分別是:
                    MODE_NIGHT_NO: 使用亮色(light)主題,不使用夜間模式
                    MODE_NIGHT_YES:使用暗色(dark)主題,使用夜間模式
                    MODE_NIGHT_AUTO:根據當前時間自動切換 亮色(light)/暗色(dark)主題
                    MODE_NIGHT_FOLLOW_SYSTEM(預設選項):設定為跟隨系統,通常為 MODE_NIGHT_NO

使用方法:

這種夜間模式只需要按照以下幾部就可以使用了:

第一步:

新增夜間模式目錄,和第一種方法的第一步一致

第二步:

需要   com.android.support:appcompat 23.2及以上的版本

及 在app  的bulid.gradle 中新增(一般建立專案的時候會自動新增):

dependencies {
    implementation 'com.android.support:appcompat-v7:27.1.1'

}

第三步:

Activity須繼承AppCompatActivity   (一定要繼承,否則無效)

第四步:

在 values—>styles.xml 中 修改你的主題樣式,將你的主題 parent  改為  Theme.AppCompat.DayNight 或者 它的子類

如: Theme.AppCompat.DayNight.NoActionBar

    <style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">

        <!-- Customize your theme here. -->
        <item name="colorAccent">@color/colorAccent</item>

    </style>

第四步:

切換主題

建議在application  onCreate 中切換,

AppCompatDelegate.setDefaultNightMode(int mode);

注意:主題的當前模式 ,需要儲存到本地( 可以通過SharePreference),程式碼中還獲取不到當前的模式