Android日间模式夜间模式切换(无需重启)

第零步:添加依赖

在app 的bulid.gradle 中添加

dependencies {
    implementation 'com.android.support:appcompat-v7:27.1.1'
}

第一步:添加夜间模式资源,以-night结尾

作用:系统在不同模式会加载对应文件夹下的文件,两种模式命名相同值不相同
drawable -> drawable-night
mipmap -> mipmap-night-xxhdpi
values -> values-night

①创建夜间资源文件夹和文件
夜间资源文件夹
②修改夜间模式对应值
③在 values-night—>styles.xml 中 修改主题样式,将主题 parent 改为 Theme.AppCompat.DayNight 或者 它的子类
在这里插入图片描述

第二步:在Application中添加接收切换事件的方法,注册事件

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        EventBus.getDefault().register(this);
    }
    
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void setNight(ChangeModeBean event){
        SharedPreferences sp=getSharedPreferences("sp",0);
        //!!最重要的一步-->切换模式
        AppCompatDelegate.setDefaultNightMode(sp.getBoolean("isNightMode",false)?AppCompatDelegate.MODE_NIGHT_YES:AppCompatDelegate.MODE_NIGHT_NO);
    }
}

第三步:当前SettingActivity继承AppCompatActivity ,切换模式时发送事件

ps:一定要继承AppCompatActivity ,否则无效

	/**
	* 记录是否夜间模式、是否改变了模式
	**/
 	private boolean isNightMode, isChange;
	private void initView() {
		//switch初始化
        isNightMode = (boolean) SharedPreferencesUtils.get("isNightMode", false);
        switchNight.setChecked(isNightMode);
        //添加switch切换监听
        switchNight.setOnCheckedChangeListener((compoundButton, b) -> {
        	//模式改变时才发送事件
        	if (isNightMode == b) return;
            isChange = !isChange;
            SharedPreferencesUtils.put("isNightMode", b);
            EventBus.getDefault().post(new ChangeModeBean());
        });
	}
	
	
	@OnClick({R.id.backImageView})
    public void onViewClicked(View view) {
        switch (view.getId()) {
        	//点击返回图标,判断切换了模式就重启MainActivity
			case R.id.backImageView:
                finish();
                if (isChange) {
                    SharedPreferencesUtils.put("isChange", true);
                    appManager.finishActivity(MainActivity.class);
                    MainActivity.startActivity(this);
                    overridePendingTransition(0, 0);//无动画
                }
                break;
       }
    }

	/**
	*按系统返回键或部分设备左滑屏幕返回时,判断切换了模式就重启MainActivity
	**/
    @Override
    public void onBackPressed() {
	//  super.onBackPressed();
        finish();
        if (isChange) {
            SharedPreferencesUtils.put("isChange", true);
            appManager.finishActivity(MainActivity.class);
            MainActivity.startActivity(this);
            overridePendingTransition(0, 0);
        }
    }

ps:不要用模拟器测试,用真机测。

第四步:MainActivity切换对应Fragment

mainActivity.java:

	@Override
    protected void onCreate(Bundle savedInstanceState) {
   		 //是否刚切换完日间/夜间模式
        boolean isFromChangeMode = (boolean) SharedPreferencesUtils.get("isChange", false);
        if (isFromChangeMode) {
        	//是,切换到MineFragment
            SharedPreferencesUtils.put("isChange", false);
            viewpager.setCurrentItem(3);
        }else{
            viewpager.setCurrentItem(0);
        }
    }

mainActivity启动模式:

<activity android:name=".activity.MainActivity"
          android:launchMode="standard"/>

mainActivity主题:解决白屏,实现秒开效果

<style name="MainActivityTheme" parent="AppTheme">
      <item name="android:windowDisablePreview">true</item>
</style>

第五步:解决bug

1)解决bug1:切换夜间模式后返回 MainActivity,MainActivity 页面没有更新

—>以上已解决:当点击返回时,我们记录此时模式是否切换,让MainActivity加载时判断需要正确显示的Fragment。并且finish当前Activity,再finish MainActivity,再启动MainActivity。

2)解决bug2: 重启MainActivity时会白屏一瞬间

白屏产生的原因?
根据Activity的UI结构,启动Activity时先去加载PhoneWindow、DecorView、TitleView。此时ContentView也就是我们的layout文件还未加载,系统将屏幕填充主题默认的背景色,就会出现白屏/黑屏。

—>以上已解决:关闭掉初始化完成之前展示的默认的window(也就是白屏),实现秒开效果。

3)解决bug3: 切换模式后,部分设备左滑直接返回到设备主页面了

—>以上已解决:onBackPressed()…

参考自:
https://blog.csdn.net/lijia1201900857/article/details/82838358
https://www.jianshu.com/p/96198f766398
https://www.pianshen.com/article/35711493224/

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android日间模式切换是指在Android设备中切换应用程序的主题模式,以更好地适应当前环境或用户的个人喜好。在日间模式下,应用程序通常使用浅色的背景和黑色的文本,以提供清晰明亮的外观。下面是关于Android日间模式切换的一些信息: 1. 如何切换日间模式Android设备通常提供了一个系统菜单或设置选项,允许用户切换日间模式。用户可以在“设置”或“显示”菜单中找到“主题”或“外观”选项,并选择日间模式以启用它。 2. 日间模式的用途:日间模式在白天或明亮的环境下使用,可提供更好的可读性和可见性。由于浅色背景和黑色文本的对比度较高,阅读和浏览应用程序内容会更加舒适和方便。 3. 切换日间模式的优势:切换日间模式可以节省设备的电池寿命,因为设备的背光需要较少的功耗。同时,对于部分用户来说,浅色背景和黑色文本也可能更易于处理眼睛疲劳问题。 4. 日夜模式的应用场景:日间模式适用于大多数日常使用情况,特别是在户外环境或光线充足的环境下。例如,用户在户外使用应用程序时,日间模式可以保证内容清晰可见。 5. 自动切换和自定义设置:一些Android设备允许用户根据日出和日落时间自动切换日间模式。此外,用户还可以根据自己的喜好,自定义日间模式的背景颜色、文本颜色和其他外观设置。 总结起来,Android日间模式切换是一个方便的功能,允许用户根据环境或个人偏好来调整应用程序的外观。通过切换日间模式,用户可以获得更好的可读性和可见性,并且在一定程度上延长设备的电池寿命。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值