从另一Activity更新SharedPreferences后首个Activity的TextView无更新如何解决
解决方案
一、先修复现有代码的显性错误
- 修正编辑器类名拼写错误
系统提供的SP编辑器接口是SharedPreferences.Editor,你代码中写的SharedPreferences.Editors多了后缀s,会直接引发编译异常。 - 删除第一个Activity的错误初始化逻辑
你当前在第一个Activity的onCreate中每次启动都强制把t的值设为0,会直接覆盖第二个Activity写入的修改;同时要删除未定义变量editor的commit()调用,这行属于无效冗余代码。初始化默认值仅需要在t对应的key不存在时执行即可。 - 第二个Activity修改完成后必须提交更改
你第二个Activity调用putInt后没有执行apply()或commit()提交,修改仅保存在内存中,不会写入SharedPreferences持久化存储。
二、修复后可运行代码示例
第一个Activity代码
public class FirstActivity extends AppCompatActivity { private TextView name; private SharedPreferences coin; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_first); name = findViewById(R.id.textview); coin = getSharedPreferences("saved", MODE_PRIVATE); // 仅当key不存在时初始化默认值,避免每次启动覆盖已存储的数据 if(!coin.contains("t")){ SharedPreferences.Editor editor2 = coin.edit(); editor2.putInt("t", 0).apply(); } } @Override protected void onResume() { super.onResume(); // 每次回到第一个页面都读取最新值刷新UI int a = coin.getInt("t", 0); name.setText(String.valueOf(a)); } }
第二个Activity加10的逻辑代码
SharedPreferences coin = getSharedPreferences("saved", MODE_PRIVATE); SharedPreferences.Editor editor2 = coin.edit(); int a = coin.getInt("t", 0); int b = a + 10; editor2.putInt("t", b); // 提交修改写入持久化存储 editor2.apply();
三、可选实时更新方案
如果你需要在第二个页面修改数值时,第一个页面无需切回就实时更新,可以在第一个Activity注册SP变化监听:
// 定义监听变量 private SharedPreferences.OnSharedPreferenceChangeListener spListener = new SharedPreferences.OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if(key.equals("t")){ int newValue = sharedPreferences.getInt(key,0); name.setText(String.valueOf(newValue)); } } }; // 在onCreate中注册监听 @Override protected void onCreate(Bundle savedInstanceState) { // 原有其他逻辑保留 coin.registerOnSharedPreferenceChangeListener(spListener); } // 在onDestroy中注销监听避免内存泄漏 @Override protected void onDestroy() { super.onDestroy(); coin.unregisterOnSharedPreferenceChangeListener(spListener); }
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

