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

多Activity间SharedPreferences保存分数失效问题求助

解决多Activity间答题分数保存问题

嘿,别担心,新手遇到SharedPreferences的逻辑问题太正常了!我帮你看看代码里的问题,一步步来修正:

问题出在哪?

  1. MainActivity初始化逻辑错误:你在onCreate里直接把初始的userPoints(大概率是0)写入SharedPreferences,这会导致每次启动MainActivity都把之前保存的分数重置为0,这肯定不对!
  2. 答题Activity分数更新逻辑搞反:你答对后更新了本地的userPoints,但根本没把这个新分数存回SharedPreferences,反而去读旧值,等于白加了分。
  3. 本地变量依赖问题:每个答题Activity的userPoints都是重新初始化的,每次进入都是0,就算你加了1,不存到SharedPreferences里也带不回MainActivity。

修正后的代码

第一步:修复MainActivity

先把onCreate里那行覆盖分数的代码删掉,我们只在需要的时候读取分数,而不是启动就重置:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    // 去掉原来的SharedPreferences写入代码,避免启动时清空分数
}

然后修正查看分数的按钮逻辑,确保读取的是SharedPreferences里的最新值:

private TextView pointsAwarded;
private SharedPreferences settings;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    // 先确保控件都正确初始化(别漏了findViewById!)
    pointsAwarded = findViewById(R.id.pointsAwarded);
    Button check = findViewById(R.id.check);
    
    settings = getSharedPreferences("userScore", Context.MODE_PRIVATE);
    
    check.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // 读取SharedPreferences里的最新分数,没存过默认0
            int currentScore = settings.getInt("score", 0);
            pointsAwarded.setText(String.valueOf(currentScore));
        }
    });
}

第二步:修复答题Activity(以Q1为例)

答题后要先读取当前保存的分数,更新后再写回去,而不是用本地变量瞎折腾:

public void submitAnswer (View view) {
    // 先获取SharedPreferences实例和编辑器
    SharedPreferences settings = getSharedPreferences("userScore", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = settings.edit();
    
    // 读出当前已保存的分数,没存过就默认0
    int currentScore = settings.getInt("score", 0);
    
    // 答对就加1
    if (correctAnswer.isChecked()) {
        currentScore += 1;
    }
    
    // 把更新后的分数存回SharedPreferences
    editor.putInt("score", currentScore);
    editor.apply(); // 用apply比commit更高效,异步写入不卡主线程
    
    Toast.makeText(this, "Answer saved", Toast.LENGTH_SHORT).show();
    Intent intent = new Intent(Q1.this, MainActivity.class);
    startActivity(intent);
}

关键注意点

  • 不要随便在启动Activity时写入SharedPreferences,尤其是会覆盖数据的操作!
  • 所有跨Activity的状态保存,一定要依赖SharedPreferences(或者ViewModel、Room等),本地变量只能用在当前Activity的临时逻辑里。
  • 记得用apply()代替commit(),除非你必须等待写入完成再做后续操作,否则apply()对主线程更友好。

这样修改后,你切换题目再回来,分数就会正常累加啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:36:57