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

重启App后SharedPreferences无法保存布尔值问题求助

解决重启App后SharedPreferences保存的深色模式状态不生效问题

我帮你找到了问题的根源,你的代码在SharedPreferences的读写和主题设置逻辑上有几处关键错误,导致重启App后深色模式状态无法正确恢复。下面一步步分析并修正:

核心错误分析

1. SettingActivity中myboolian()方法逻辑完全错误

这个方法的作用应该是保存当前的深色模式状态,但你现在写的是每次调用都会翻转isDarkMode的值(isDarkMode = !isDarkMode),而且在onCreate一开始就调用了它——这会导致每次进入设置页都会强制切换状态,直接覆盖了之前保存的值,完全失去了持久化的意义。

另外,你在Switch的切换监听里修改了isDarkMode,但没有调用保存方法,导致切换后的状态根本没写入SharedPreferences。

2. SettingActivity启动时没有读取已保存的状态

你在onCreate里是根据AppCompatDelegate的当前状态来设置isDarkMode,但AppCompatDelegate的状态在App重启后会重置,不会自动关联SharedPreferences的值,所以启动时应该先从SharedPreferences读取保存的状态,再同步UI和主题。

3. MainActivity的主题设置逻辑不完整

你只在isDarkMode为true时处理主题,false的情况没有对应逻辑,导致重启后浅色模式无法正确应用。而且主题设置应该直接基于SharedPreferences的值,而不是依赖AppCompatDelegate的当前状态。


修正后的完整代码

SettingActivity.java

package com.kurdfoxx.nightmodewithsharedprefrense;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.Toast;

public class SettingActivity extends AppCompatActivity {
    Switch mySwitch;
    boolean isDarkMode = false;
    private static final String DARKMODE = "login";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // 第一步:先读取SharedPreferences中保存的状态
        loadSavedDarkModeState();

        // 根据读取到的状态设置主题
        if (isDarkMode) {
            setTheme(R.style.darkTheme);
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
        } else {
            setTheme(R.style.AppTheme);
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
        }

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setting);

        Toast.makeText(this, "当前深色模式状态:" + isDarkMode, Toast.LENGTH_SHORT).show();

        mySwitch = findViewById(R.id.switch1);
        // 根据读取到的状态设置Switch的选中状态
        mySwitch.setChecked(isDarkMode);

        mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                isDarkMode = isChecked;
                // 切换后立即保存状态
                saveDarkModeState(isDarkMode);
                // 切换主题并重启页面
                if (isChecked) {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                } else {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                }
                restartApp();
            }
        });

        Button buttonGoMain = findViewById(R.id.btn_go_MainAct);
        buttonGoMain.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(SettingActivity.this, MainActivity.class));
            }
        });
    }

    public void restartApp() {
        Intent intentRestartApp = new Intent(getApplicationContext(), SettingActivity.class);
        startActivity(intentRestartApp);
        finish();
    }

    // 读取保存的深色模式状态
    private void loadSavedDarkModeState() {
        SharedPreferences sharedPreferences = getSharedPreferences(DARKMODE, MODE_PRIVATE);
        isDarkMode = sharedPreferences.getBoolean("ISDARKMODE", false);
    }

    // 保存深色模式状态
    private void saveDarkModeState(boolean state) {
        SharedPreferences sharedPreferences = getSharedPreferences(DARKMODE, MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean("ISDARKMODE", state);
        editor.apply();
    }
}

MainActivity.java

package com.kurdfoxx.nightmodewithsharedprefrense;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private static final String DARKMODE = "login";
    boolean isDarkMode = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // 读取保存的状态
        loadSavedDarkModeState();

        // 根据状态设置主题和深色模式
        if (isDarkMode) {
            setTheme(R.style.darkTheme);
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
        } else {
            setTheme(R.style.AppTheme);
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
        }

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = findViewById(R.id.button_go_to_setting_activity);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, SettingActivity.class));
            }
        });
    }

    private void loadSavedDarkModeState() {
        SharedPreferences sharedPreferences = getSharedPreferences(DARKMODE, MODE_PRIVATE);
        isDarkMode = sharedPreferences.getBoolean("ISDARKMODE", false);
    }
}

关键修改说明

  1. 拆分读写逻辑:把原来错误的myboolian()拆分成loadSavedDarkModeState()和saveDarkModeState(),分别负责读取和保存状态,逻辑更清晰。
  2. 启动时先读取状态:在onCreate的最开始就读取SharedPreferences的值,确保主题和UI状态都基于已保存的设置。
  3. 切换时立即保存:在Switch的监听事件中,修改isDarkMode后马上调用保存方法,确保状态被持久化。
  4. 同步主题和AppCompatDelegate:在两个Activity中都根据读取到的状态同时设置主题和AppCompatDelegate的模式,保证App内主题一致性。

这样修改后,重启App就能正确恢复之前保存的深色模式状态了。

内容的提问来源于stack exchange,提问作者Sirwan Rahimi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 08:12:34