如何在Android中使用Switch保存夜间模式状态?
Android 夜间模式与Switch状态持久化实现(Java)
接触Android Studio刚满1个月,之前碰到的问题都能自己捣鼓解决,但这次做夜间模式与Switch状态持久化存储卡了整整4天——明明知道要用SharedPreferences做读写,却搞不定AppCompatDelegate的夜间模式值转可存储整数的问题,虽然成功保存了Switch的状态,但夜间模式始终无法同步适配。
最终反复调试出可正常运行的Settings.java代码,核心实现逻辑如下:
public class Settings extends AppCompatActivity { private SwitchCompat nightModeSwitch; private SharedPreferences sharedPreferences; // 偏好存储名称与键名 private static final String PREF_NAME = "NightModePrefs"; private static final String KEY_NIGHT_MODE = "night_mode"; private static final String KEY_SWITCH_STATE = "switch_state"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 优先读取已保存的夜间模式,提前设置 sharedPreferences = getSharedPreferences(PREF_NAME, MODE_PRIVATE); int savedNightMode = sharedPreferences.getInt(KEY_NIGHT_MODE, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); AppCompatDelegate.setDefaultNightMode(savedNightMode); setContentView(R.layout.activity_settings); nightModeSwitch = findViewById(R.id.night_mode_switch); // 恢复Switch的保存状态 boolean savedSwitchState = sharedPreferences.getBoolean(KEY_SWITCH_STATE, false); nightModeSwitch.setChecked(savedSwitchState); // 监听Switch切换事件,同步保存状态与夜间模式 nightModeSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> { SharedPreferences.Editor editor = sharedPreferences.edit(); // 保存Switch状态 editor.putBoolean(KEY_SWITCH_STATE, isChecked); // 对应设置夜间模式并保存常量值(本身就是int类型,无需额外转换) int targetNightMode = isChecked ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO; editor.putInt(KEY_NIGHT_MODE, targetNightMode); editor.apply(); // 立即触发夜间模式切换 AppCompatDelegate.setDefaultNightMode(targetNightMode); }); } }
关键解决要点
AppCompatDelegate的夜间模式常量(如MODE_NIGHT_YES、MODE_NIGHT_NO)本身就是整数类型,可直接存入SharedPreferences,无需额外转换- 启动页面时先设置夜间模式,再加载布局,避免布局加载后样式不更新
- 将Switch状态与夜间模式值绑定保存,确保两者状态完全同步
内容的提问来源于stack exchange,提问作者Xsane Xalor
相关产品推荐
相关产品推荐

