1.创建文件夹
就在res 下新建 values-night目录,创建对应的colors.xml文件。如果适配图片的话,就创建对应的 drawable-night目录。
正常情况下,系统会调用values里面的颜色还有主题等信息,当切换到深色模式的时候,系统就会调用“-night”的文件夹里面的信息,所以当你需要深色模式的图片时,对应就需要创建“mipmap-xxhdpi-night”等等
2.主题设置
在values和values-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里重新设置!!切记,像这样