多Activity间SharedPreferences保存分数失效问题求助
解决多Activity间答题分数保存问题
嘿,别担心,新手遇到SharedPreferences的逻辑问题太正常了!我帮你看看代码里的问题,一步步来修正:
问题出在哪?
- MainActivity初始化逻辑错误:你在
onCreate里直接把初始的userPoints(大概率是0)写入SharedPreferences,这会导致每次启动MainActivity都把之前保存的分数重置为0,这肯定不对! - 答题Activity分数更新逻辑搞反:你答对后更新了本地的
userPoints,但根本没把这个新分数存回SharedPreferences,反而去读旧值,等于白加了分。 - 本地变量依赖问题:每个答题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
相关产品推荐
相关产品推荐

