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

使用SwitchMaterial实现推送通知开关时状态无法保存问题求助

问题原因及修复方案

现有代码核心问题

    1. Editor变量名引用错误:代码中声明的Editor实例名为escoreEditor,但实际存储时调用的是未定义的editor变量,导致开关状态根本没有成功写入SharedPreferences,这是最核心的错误。
    1. 无状态回显逻辑:仅实现了开关状态变化时的存储逻辑,但每次进入SettingsActivity时,没有从SharedPreferences读取已保存的状态赋值给SwitchMaterial控件,布局默认设置了android:checked="true",所以每次打开页面都会默认显示开启状态。
    1. 代码冗余:每次开关状态变化都重复创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:06:07