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

如何使用SharedPreferences的putString?跨Activity取值始终返回默认值问题

问题解答:SharedPreferences使用指南及取值失败问题修复

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当成了值——这两个错误直接导致后续取不到数据:

  1. 存储的键是用户输入的内容(比如用户输入“小明”,键就是“小明”),但你取值时用的键是固定字符串"inp",完全不匹配;
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 09:33:11