Android 切换夜间模式

35 篇文章 0 订阅

刚刚突然想弄一个夜间模式所以我开始了
首先Android默认是白天模式也就是正常模式的values文件,所以我要创建一个夜间的文件夹values-night,在里面添加colors.xml注意里面颜色的name需要与正常的values的name一致这样才能自动切换访问(相当于不同分辨率的mipmap-xhdpi放入多套图一样的道理)
values-nigh
这个是正常模式下的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
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王富贵王富贵王富贵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值