You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:45:31