就在res 下新建 values-night目录,创建对应的colors.xml文件。如果适配图片的话,就创建对应的 drawable-night目录。
正常情况下,系统会调用values里面的颜色还有主题等信息,当切换到深色模式的时候,系统就会调用“-night”的文件夹里面的信息,所以当你需要深色模式的图片时,对应就需要创建“mipmap-xxhdpi-night”等等
在values和values-night里面把你的主题设置为继承“Theme.AppCompat.DayNight”或者是它的子类“Theme.AppCompat.DayNight.NoActionBar”等,这是我的主题
colors.xml这个文件,要保证在values和values-night这两个文件夹里面是一样的,里面参数的名字要保证一模一样 参数值可以设置为不一样,白天模式的颜色值可以设置在values的color里面,深色模式的颜色值设置在values-night里面。
这是我获取到的微信的颜色设置,如果有需要的话,可以使用一下。
我们还可以监听到暗黑的主题是否开启
(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
其实现在还有点问题,微信可以在设置深色模式之后直接在后台切换不崩溃,但是这种方式只能在桌面重新打开才可以,目前还没有找到一个更好的方式解决,我再想想看吧
一旦在manifest里面设置了android:configChanges的话,那么在代码里面设置的屏幕方向就不好使了,必须要在manifest里重新设置!!切记,像这样