如何使用SharedPreferences的putString?跨Activity取值始终返回默认值问题
1. 如何使用SharedPreferences的putString方法?
使用putString存储字符串其实很简单,分四步走:
- 获取SharedPreferences实例:通过
getSharedPreferences("你的存储文件名", 模式)获取,常用模式是Context.MODE_PRIVATE(只有当前应用能访问)。如果是单个Activity专用,也可以用getPreferences(Context.MODE_PRIVATE),不用指定文件名。 - 获取Editor对象:调用
sp.edit()拿到编辑实例,因为SharedPreferences本身是只读的,必须通过Editor修改数据。 - 调用putString存储数据:方法参数是
putString(键名, 要存储的字符串)——这里的键名是后续取值的唯一标识,一定要记牢,取值时必须用相同的键名。 - 提交修改:有两种方式:
editor.commit():同步提交,返回布尔值表示是否成功,适合需要确认存储结果的场景;editor.apply():异步提交,没有返回值,不会阻塞主线程,是Android官方推荐的方式。
举个简单的例子:
// 获取实例 SharedPreferences sp = getSharedPreferences("my_prefs", Context.MODE_PRIVATE); // 编辑存储 SharedPreferences.Editor editor = sp.edit(); editor.putString("user_nickname", "张三"); // 提交 editor.apply();
2. 修复“取值始终返回默认值”的问题
看了你的代码,问题出在存储时的参数完全搞反了,且键名不匹配!
问题分析
你存储时写了:
editor.putString(inp,nameInput);
这里putString的第一个参数是键(Key),第二个是要存储的字符串值(Value),但你把用户输入的内容inp当成了键,把EditText控件nameInput当成了值——这两个错误直接导致后续取不到数据:
- 存储的键是用户输入的内容(比如用户输入“小明”,键就是“小明”),但你取值时用的键是固定字符串
"inp",完全不匹配; nameInput是EditText控件对象,不是字符串,存储的其实是这个对象的toString()结果(不是用户输入的内容),就算键对了也取不到正确值。
修正后的代码
存储代码(修改核心错误)
name_next = (Button) findViewById(R.id.name_next); sp= getSharedPreferences("name_pref",Context.MODE_PRIVATE); // 定义一个固定的键名,存储和取值都用它,避免出错 final String KEY_USER_NAME = "user_name"; name_next.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { inp = nameInput.getText().toString(); // 先判断输入是否为空,避免存储无效内容 if (!TextUtils.isEmpty(inp)) { SharedPreferences.Editor editor= sp.edit(); // 正确参数:键名 + 用户输入的字符串值 editor.putString(KEY_USER_NAME, inp); // 推荐用apply()异步提交,效率更高 editor.apply(); Toast.makeText(com.calmo.name.this,"welcome "+inp,Toast.LENGTH_LONG).show(); Intent intent = new Intent(name.this,MainActivity.class); startActivity(intent); } else { Toast.makeText(com.calmo.name.this,"请输入名称",Toast.LENGTH_SHORT).show(); } } });
取值代码(和存储用相同的键名)
// 必须和存储时的键名完全一致 String KEY_USER_NAME = "user_name"; SharedPreferences sp= getApplicationContext().getSharedPreferences("name_pref",Context.MODE_PRIVATE); // 第一个参数是键名,第二个是取不到值时的默认值 String name_in = sp.getString(KEY_USER_NAME,"Error"); name.setText(name_in);
额外注意事项
- 键名要固定且唯一,最好用常量定义,避免拼写错误;
- 存储和取值的SharedPreferences文件名(这里是
"name_pref")必须完全一致,大小写敏感; - 永远确认存储的Value是你需要的类型(比如字符串),不要传控件对象或者其他非目标类型;
- 如果需要跨进程访问,才用其他模式,普通场景用
MODE_PRIVATE就够了。
内容的提问来源于stack exchange,提问作者Suvooh
相关产品推荐
相关产品推荐

