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

如何通过SharedPreferences在LoginActivity与MainActivity间传值?日志无输出

解决SharedPreferences保存/读取无Log输出的问题

咱们先从SharedPreferences最容易踩的几个坑入手排查,这些大概率是你Log没输出的原因:

1. 保存数据时的核心错误:忘记提交修改

很多同学写完putXXX()操作就直接跳转页面了,但SharedPreferences的编辑操作必须通过apply()或commit()才能真正持久化数据:

// LoginActivity中正确的保存逻辑示例
SharedPreferences sp = getSharedPreferences("LoginStorage", MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
// 替换成你要保存的实际键值对
editor.putString("user_account", inputAccount); 
editor.putInt("user_id", 1001);
// 二选一:apply()是异步提交(推荐,不卡主线程),commit()是同步提交
editor.apply(); 
// 这里可以先打Log确认保存动作执行了
Log.d("LoginActivity", "数据已提交保存");

如果漏了apply()/commit(),数据根本没写入本地,后续读取自然拿不到值,Log也就没内容输出。

2. 读取数据时的匹配问题

文件名或键名不匹配

读取时的SharedPreferences文件名、键名必须和保存时完全一致(大小写敏感):

// MainActivity中正确的读取逻辑示例
SharedPreferences sp = getSharedPreferences("LoginStorage", MODE_PRIVATE);
// 第二个参数是找不到键时的默认值,一定要设个非空值,避免Log输出空内容
String account = sp.getString("user_account", "未获取到账号");
Log.d("MainActivity", "读取到的账号:" + account);

要是你保存时用的是"login_storage"(全小写),读取时写成"LoginStorage",或者键名写成"User_Account",肯定拿不到数据,Log就会输出默认值——如果默认值是空字符串,看起来就像没输出。

Log内容为空导致无输出

如果你的Log语句是Log.d("TAG", account),而account是空字符串或null,Logcat里只会显示标签,看不到内容,容易误以为没输出。所以一定要给读取的默认值设个兜底内容(比如上面的"未获取到账号"),或者给Log加固定前缀。

3. 上下文使用错误

确保获取SharedPreferences时用的是正确的上下文:

  • 在Activity里直接调用getSharedPreferences()没问题
  • 如果是在Fragment中,要使用requireActivity().getSharedPreferences(),不要随便用Application上下文(除非你特意要全局共享,但一般登录数据用私有模式即可)

完整可运行示例

LoginActivity保存代码

// 假设点击登录按钮触发保存
btnLogin.setOnClickListener(v -> {
    String inputAccount = etAccount.getText().toString().trim();
    if (!inputAccount.isEmpty()) {
        // 初始化SharedPreferences,私有模式仅当前App可访问
        SharedPreferences sp = getSharedPreferences("LoginPrefs", MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.putString("saved_account", inputAccount);
        editor.apply();
        Log.d("LoginActivity", "已保存账号:" + inputAccount);
        // 跳转到MainActivity
        startActivity(new Intent(LoginActivity.this, MainActivity.class));
        finish();
    }
});

MainActivity读取代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    SharedPreferences sp = getSharedPreferences("LoginPrefs", MODE_PRIVATE);
    String savedAccount = sp.getString("saved_account", "无有效账号");
    // 这里的Log一定会有输出,哪怕是默认值
    Log.d("MainActivity", "从SharedPreferences读取:" + savedAccount);
}

你可以对照上面的点逐一检查你的代码,重点排查是否提交了修改、文件名/键名是否完全匹配、Log是否有兜底内容。

内容的提问来源于stack exchange,提问作者Jaan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:11:44