使用SwitchMaterial实现推送通知开关时状态无法保存问题求助
问题原因及修复方案
现有代码核心问题
- Editor变量名引用错误:代码中声明的Editor实例名为
escoreEditor,但实际存储时调用的是未定义的editor变量,导致开关状态根本没有成功写入SharedPreferences,这是最核心的错误。
- Editor变量名引用错误:代码中声明的Editor实例名为
- 无状态回显逻辑:仅实现了开关状态变化时的存储逻辑,但每次进入
SettingsActivity时,没有从SharedPreferences读取已保存的状态赋值给SwitchMaterial控件,布局默认设置了android:checked="true",所以每次打开页面都会默认显示开启状态。
- 无状态回显逻辑:仅实现了开关状态变化时的存储逻辑,但每次进入
- 代码冗余:每次开关状态变化都重复创建SharedPreferences和Editor实例,无必要。
修复后的代码实现
SettingsActivity.java修正代码
public class SettingsActivity extends AppCompatActivity { // 统一使用常量避免拼写错误 private static final String PREF_NAME = "AlertLastChange"; private static final String KEY_TOGGLE_VALUE = "key_ToggleValue"; SharedPreferences eScoreAlertPreferences; SwitchMaterial toggleButtonAlert; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_settings); // SharedPreferences只需要初始化一次 eScoreAlertPreferences = getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); toggleButtonAlert = findViewById(R.id.toggleButtonAlert); // 页面加载时先回显已存储的开关状态 boolean savedState = eScoreAlertPreferences.getBoolean(KEY_TOGGLE_VALUE, true); toggleButtonAlert.setChecked(savedState); // 监听开关状态变化直接存储 toggleButtonAlert.setOnCheckedChangeListener((buttonView, isChecked) -> { eScoreAlertPreferences.edit() .putBoolean(KEY_TOGGLE_VALUE, isChecked) .apply(); // apply为异步写入,比commit更适合主线程操作 }); } }
FeedActivity.java优化建议(可选)
现有读取逻辑可正常运行,建议将SharedPreferences文件名、存储key也统一替换为上述常量,避免两处拼写不一致导致读取失败。
内容的提问来源于stack exchange,提问作者Yashwant Kumar
相关产品推荐
相关产品推荐

