Android 切换夜间模式
刚刚突然想弄一个夜间模式所以我开始了
首先Android默认是白天模式也就是正常模式的values文件,所以我要创建一个夜间的文件夹values-night,在里面添加colors.xml注意里面颜色的name需要与正常的values的name一致这样才能自动切换访问(相当于不同分辨率的mipmap-xhdpi放入多套图一样的道理)
这个是正常模式下的colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#6200EE</color>
<color name="colorPrimaryDark">#3700B3</color>
<color name="colorAccent">#03DAC5</color>
</resources>
这个是夜间模式的colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--title颜色-->
<color name="colorPrimary">#1B1919</color>
<!--沉浸颜色-->
<color name="colorPrimaryDark">#1B1919</color>
<color name="colorAccent">#3C3737</color>
</resources>
需要注意的是不要忘记切换主题values/styles(styles.xml)切换成
Theme.AppCompat.DayNight这样才可以切换白夜模式
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
接下来就是进行button切换白夜模式了
两个button按钮进行切换,注意在切换的同时需要进行记录当前选择的状态,这样的话下次进行切换的时候可以记住当前你选择的模式,创建Application,在里面获取当前sp(SharedPreferences)存储的状态进行初始化切换
MainActivity
public class MainActivity extends AppCompatActivity {
private SharedPreferences congig;
private SharedPreferences.Editor edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
congig = getSharedPreferences("config", MODE_PRIVATE);
edit = congig.edit();
setContentView(R.layout.activity_main);
findViewById(R.id.night).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//夜间 切换 日间
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
edit.putBoolean("isnight",true).commit();
}
});
findViewById(R.id.daytime).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//日间 切换 夜间
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
edit.putBoolean("isnight",false).commit();
}
});
}
}
多说一句模式吧:
MODE_NIGHT_FOLLOW_SYSTEM 跟随系统
通常为 MODE_NIGHT_NO 日间模式
MODE_NIGHT_AUTO模式:自动模式APP有网络及定位权限时。系统会根据当地的时间判断当前时处于白天还是黑夜,从而自动加载不同的模式
Application
public class app extends Application {
private SharedPreferences congig;
private SharedPreferences.Editor edit;
@Override
public void onCreate() {
super.onCreate();
congig = getSharedPreferences("config", MODE_PRIVATE);
edit = congig.edit();
boolean isnight = congig.getBoolean("isnight", true);
if (isnight){
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
}else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
}
}
}
可能你会觉得这样切换会很生硬,可以按照去求去添加动画在reate前
上个图片吧懒得去弄gif图片了
注意
切换只作用于新生成的组件,对原先处于任务栈中的Activity不起作用。(解决方法:发送广播,让它重启)如果直接在Activity的onCreate()中调用切换代码,可以不需要调用recreate()。对于一些数据的保存与切换后的显示我们可以用savedInstanceState来保存与复原.在切换后可以不调用recreate(),而是自己添加一个重启该Activity的方法,然后加个过度动画
思路来源于:https://www.jianshu.com/p/b8fc1953ae9f
上一篇: php中命名空间学习基础知识记忆
推荐阅读
-
VirtualBox的Linux虚拟机文本模式和图形模式的切换问题
-
百度地图怎么切换公交地铁模式 百度地图切换公交地铁模式教程
-
Android Q提供桌面模式 罗永浩:谷歌官方做的不会好用
-
android 中 textview状态切换时变换文字颜色
-
Android 入门第十讲02-广播(广播概述,使用方法(系统广播,自定义广播,两个activity之间的交互和传值),EventBus使用方法,数据传递,线程切换,Android的系统广播大全)
-
java单例模式实现面板切换
-
Android编程之四种Activity加载模式分析
-
Android编程实现左右滑动切换背景的方法
-
Android实现应用内置语言切换功能
-
Android使用Fragment打造万能页面切换框架