Android中SharedPreferences跨Activity共享int变量失败求助
嘿,我帮你排查下代码里的问题,核心是SharedPreferences的文件名和键名没有统一匹配,导致第二个Activity读不到正确的值,具体问题和修复方案如下:
问题分析
你代码里有两个关键不匹配的地方:
- SharedPreferences文件名不一致:第一个Activity用
valsat变量作为文件名,但第二个Activity用字符串"valsat"获取,而且你在第二个Activity里把valsat定义成了int类型的0,这完全不是同一个名称; - 存储/读取的键名不匹配:第一个Activity用
valsat作为putInt的键,第二个Activity用"valsat"作为getInt的键,同样不对应。
这两个不匹配导致第二个Activity找不到你存储的数据,只能返回默认值0。
修复方案
我们需要统一SharedPreferences的文件名和键名,最好用字符串常量来避免拼写错误,以下是修正后的代码:
第一个Activity(存储数据)
// 定义统一的常量,建议放在一个公共类里,或者两个Activity都复制这段常量定义 private static final String PREF_FILE_NAME = "SatValuesPrefs"; private static final String KEY_SAT_VALUE = "sat_value_key"; // 存储逻辑 TextView valsat2 = findViewById(R.id.valsatu); SharedPreferences sharedpreferences = getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedpreferences.edit(); // 建议加个异常处理,防止输入不是整数的情况 try { int n = Integer.parseInt(valsat2.getText().toString()); editor.putInt(KEY_SAT_VALUE, n); editor.apply(); // 用apply()代替commit(),异步提交更高效,不阻塞主线程 } catch (NumberFormatException e) { // 处理输入不是整数的情况,比如提示用户 e.printStackTrace(); }
第二个Activity(读取数据)
// 和第一个Activity用完全相同的常量 private static final String PREF_FILE_NAME = "SatValuesPrefs"; private static final String KEY_SAT_VALUE = "sat_value_key"; // 读取逻辑 TextView sat = findViewById(R.id.valoresaturazione); SharedPreferences sharedpreferences = getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE); // 第二个参数是默认值,当找不到对应键时返回0 int valsatn = sharedpreferences.getInt(KEY_SAT_VALUE, 0); sat.setText(String.valueOf(valsatn));
额外注意事项
- 尽量把常量放在一个公共的工具类里(比如
AppConstants.java),这样两个Activity直接引用,避免重复定义和拼写错误; - 处理
Integer.parseInt的异常,防止用户输入非整数内容导致崩溃; - 优先使用
apply()代替commit(),commit()是同步提交,在主线程会有性能问题,apply()是异步的,更适合大多数场景。
内容的提问来源于stack exchange,提问作者Marco Giglio
相关产品推荐
相关产品推荐

