Android 夜间模式系列笔记(一)AppCompatDelegate

系列文章:

《Android 夜间模式系列笔记(二)通过更换主题实现夜间模式》

Support Library 23.2在AppCompat 加入了新的主题:Theme.AppCompat.DayNight,使应用可以很便捷的实现日夜模式。


            

使用方式:

1.引入support包(版本需要大于23.2

compile 'com.android.support:appcompat-v7:26.+'

2.主题继承Theme.AppCompat.DayNight      

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.DayNight.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>

3.资源文件加添加XXX-night的文件夹,并添加需要设置夜间模式的资源

     比如上面的颜色资源可以这样设置

      res/values/colors.xml(白天)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
    <color name="app_bg_color">#FFFFFF</color>
    <color name="text_color">#000000</color>
</resources>

      res/values-night/colors.xml(夜间)      

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
    <color name="app_bg_color">#000000</color>
    <color name="text_color">#FFFFFF</color>
</resources>

4.设置日夜间模式

    通过调用AppCompatDelegate.setDefaultNightMode(mode),可以设置全局的夜间模式(进程)

    通过调用getDelegate().setLocalNightMode(mode),可以设置局部的夜间模式(当前组件)

    设置完后,需要调用recreate()重启activity

    mode的取值有四种:

       AppCompatDelegate.MODE_NIGHT_NO  :白天模式
       AppCompatDelegate.MODE_NIGHT_YES  :夜间模式
       AppCompatDelegate.MODE_NIGHT_AUTO  :根据当前时间自动切换日夜间模式(比如北京时间22:00会自动切换为夜间)
       AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM :跟随系统


5.初始化模式

  可以在application里面设置 

        

static {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_ NIGHT_YES);
}

    或者在oncreate里面恢复上一次保存的状态值

        

int nightMode = SharedPrefUtil.getInstance().getNightMode();
AppCompatDelegate.setDefaultNightMode(nightMode);

  6.需要注意的问题

      (1)如果启动时设置为夜间模式,可能会先闪过一个白色页面才进入夜间模式

              解决办法: 去掉默认的窗口背景色 

               

<item name="android:windowBackground">@null</item>

      (2)调用recreate()重启activity,需要注意保存当前的数据,然后恢复

       (3)对于多个activity,如果是设置的全局的夜间模式,则所有的activity都需要调用一次recreate,否则没有调用的页面是不会生效的



demo链接:https://github.com/swustmuzi/PNightMode

       


猜你喜欢

转载自blog.csdn.net/qqwuy_muzi/article/details/79020163