安卓夜间模式开发【深色主题适配】

1.创建文件夹

就在res 下新建 values-night目录,创建对应的colors.xml文件。如果适配图片的话,就创建对应的 drawable-night目录。

 正常情况下,系统会调用values里面的颜色还有主题等信息,当切换到深色模式的时候,系统就会调用“-night”的文件夹里面的信息,所以当你需要深色模式的图片时,对应就需要创建“mipmap-xxhdpi-night”等等

2.主题设置

valuesvalues-night里面把你的主题设置为继承“Theme.AppCompat.DayNight”或者是它的子类“Theme.AppCompat.DayNight.NoActionBar”等,这是我的主题

 colors.xml这个文件,要保证在values和values-night这两个文件夹里面是一样的,里面参数的名字要保证一模一样 参数值可以设置为不一样,白天模式的颜色值可以设置在values的color里面,深色模式的颜色值设置在values-night里面。

 这是我获取到的微信的颜色设置,如果有需要的话,可以使用一下。

3.监听深色主题是否开启

我们还可以监听到暗黑的主题是否开启
(1)在清单文件中给对应的Activity配置 android:configChanges=“uiMode”:

<activity android:name=".MainActivity"             android:configChanges="uiMode">             <intent-filter>                 <action android:name="android.intent.action.MAIN" />                  <category android:name="android.intent.category.LAUNCHER" />             </intent-filter> </activity> 

(2)在onConfigurationChanged方法中获取:

@Override     public void onConfigurationChanged(Configuration newConfig) {         super.onConfigurationChanged(newConfig);         int currentNightMode = newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK;         switch (currentNightMode) {             case Configuration.UI_MODE_NIGHT_NO:                 //关闭夜间模式                 Log_Ma.e("=======", "=====关闭夜间模式====");                 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);                 ActivityManager.getAppManager().finishAllActivity();                 startActivity(MainActivity.class);                 break;             case Configuration.UI_MODE_NIGHT_YES:                 //打开夜间模式                 Log_Ma.e("=======", "=====开启夜间模式====");                 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);                 ActivityManager.getAppManager().finishAllActivity();                 startActivity(MainActivity.class);                 break;             default:                 break;         }     }

这时,可以通过系统的设置切换暗黑模式的关闭和开启。

setDefaultNightMode参数有以下几种模式: 浅色 - MODE_NIGHT_NO 深色 - MODE_NIGHT_YES 由省电模式设置 - MODE_NIGHT_AUTO_BATTERY 系统默认 - MODE_NIGHT_FOLLOW_SYSTEM

4.总结

其实现在还有点问题,微信可以在设置深色模式之后直接在后台切换不崩溃,但是这种方式只能在桌面重新打开才可以,目前还没有找到一个更好的方式解决,我再想想看吧

一旦在manifest里面设置了android:configChanges的话,那么在代码里面设置的屏幕方向就不好使了,必须要在manifest里重新设置!!切记,像这样