如何通过SharedPreferences在LoginActivity与MainActivity间传值?日志无输出
咱们先从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
相关产品推荐
相关产品推荐

