Android使用Fragment实现夜间模式,重启应用后状态丢失如何解决
问题根因
- 现有代码仅在读取到夜间模式为开启状态时才主动设置全局夜间模式,若存储值为关闭(false),没有对应的
MODE_NIGHT_NO设置逻辑,App启动后会默认使用系统默认的浅色模式。 - 夜间模式的全局设置时机过晚,放在Fragment/Activity的生命周期中执行,App启动时会先加载默认主题,再执行切换逻辑,容易出现配置不生效、启动闪屏的问题。
修复方案
步骤1:修复现有读取逻辑的分支缺失
先调整你Fragment中读取SharedPreferences后的处理逻辑,补全关闭状态的设置分支:
sharedPreferences = getActivity().getSharedPreferences("night",0); // 默认值根据你的App默认主题调整,这里默认浅色就设为false Boolean isNightModeOn = sharedPreferences.getBoolean("night_mode",false); if(isNightModeOn){ AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); switchCompat.setChecked(true); }else{ // 补全关闭状态的设置逻辑 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); switchCompat.setChecked(false); }
步骤2:把初始化逻辑前移到Application(必做)
全局夜间模式需要在App启动的第一时间加载,避免后续页面初始化时配置还没生效:
- 新建自定义Application类:
public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); SharedPreferences sp = getSharedPreferences("night", MODE_PRIVATE); boolean isNightMode = sp.getBoolean("night_mode", false); AppCompatDelegate.setDefaultNightMode(isNightMode ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO); } }
- 在
AndroidManifest.xml的<application>标签中注册该自定义类:
<application android:name=".MyApp" ... 其余原有配置不变 >
可选优化
你在OnCheckedChangeListener中不需要手动调用switchCompat.setChecked(),参数isChecked本身就是开关的最新状态,重复调用属于冗余代码,可以直接删除。
内容的提问来源于stack exchange,提问作者Abuzar
相关产品推荐
相关产品推荐

