重启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); } }
关键修改说明
- 拆分读写逻辑:把原来错误的
myboolian()拆分成loadSavedDarkModeState()和saveDarkModeState(),分别负责读取和保存状态,逻辑更清晰。 - 启动时先读取状态:在
onCreate的最开始就读取SharedPreferences的值,确保主题和UI状态都基于已保存的设置。 - 切换时立即保存:在Switch的监听事件中,修改
isDarkMode后马上调用保存方法,确保状态被持久化。 - 同步主题和AppCompatDelegate:在两个Activity中都根据读取到的状态同时设置主题和
AppCompatDelegate的模式,保证App内主题一致性。
这样修改后,重启App就能正确恢复之前保存的深色模式状态了。
内容的提问来源于stack exchange,提问作者Sirwan Rahimi
相关产品推荐
相关产品推荐

