使用AndroidSDK自带的support lib来实现APP日间/夜间模式的切换
添加依赖包appcompat-v7
在app module的gradle中依赖appcompat库,版本最低是23.2.0
implementation 'com.android.support:appcompat-v7:26.1.0'
修改Application的theme样式
把Theme.AppCompat.Light 修改为Theme.AppCompat.DayNight
就是Light改为DayNight,DayNight这个主题或者它的子主题才支持白夜间模式的切换
<!--<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">-->
<style name="AppTheme" parent="Theme.AppCompat.DayNight.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
调用切换模式
代码调用切换模式,设置AppCompatDelegate.MODE_NIGHT_YES或者AppCompatDelegate.MODE_NIGHT_NO来控制切换
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
简单使用:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v){
int mode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
if (mode == Configuration.UI_MODE_NIGHT_YES) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
}
getWindow().setWindowAnimations(R.style.WindowAnimationFadeInOut);
recreate();
}
}
通过上面的方式调用就能进行夜间模式切换,但是会出现闪动:
可以设置一个转化的动画:
//AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
getWindow().setWindowAnimations(R.style.WindowAnimationFadeInOut);
recreate();
动画样式:
<style name="WindowAnimationFadeInOut">
<item name="android:windowEnterAnimation">@anim/fade_in</item>
<item name="android:windowExitAnimation">@anim/fade_out</item>
</style>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:duration="1000"
android:fromAlpha="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toAlpha="1.0"/>
</set>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:duration="1500"
android:fromAlpha="1.0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toAlpha="0"/>
</set>
加入动画的效果:
其他
1.如果想给不同的模式设置不同的color ,需要新建一个values-night的文件夹来兼容
2.如果想给不同的view设置不同的样式,可以建不同的style,给不同的view引用
动态切换皮肤:
实现自己的一套动态切换皮肤功能
注意
1.app或者activity引用的style需要是Theme.AppCompat.DayNight或者它的子style
2.调用getDelegate().setLocalNightMode()的Activity必须是继承AppCompatActivity
参考文章:http://blog.csdn.net/yanzhenjie1003/article/details/52464363