欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 切换夜间模式

程序员文章站 2022-03-09 22:25:20
...

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