如何不使用SharedPreferences从Firebase Realtime Database获取当前及其他用户Uid
问题原因
你原来用SharedPreferences传递profileId的方案存在两个明显缺陷:
- 你在
Profile碎片读取完SP后直接清空了SP内容,后续MyPosts等碎片读取时拿到的是默认值,自然只会显示当前登录用户的资料 - 跨页面传递临时参数用SP本身就存在时序问题,点击其他用户跳转时可能还没完成SP写入就已经触发了ProfileActivity的读取逻辑,导致拿的还是旧值
修改方案(完全移除SharedPreferences依赖)
1. 跳转ProfileActivity时通过Intent传递目标用户UID
无论你是点击自己头像进入个人页,还是点击搜索结果的其他用户头像进入对应主页,跳转时都直接把目标UID存入Intent:
// 示例:搜索页点击用户跳转逻辑 Intent intent = new Intent(SearchActivity.this, ProfileActivity.class); // 传入点击的用户UID,自己的个人页就传当前登录用户的UID intent.putExtra("target_uid", clickedUserUid); startActivity(intent);
2. 修改ProfileActivity获取profileId的逻辑
删除原来读取SharedPreferences的代码,直接从Intent取参数:
// 替换原来读SP的代码 profileId = getIntent().getStringExtra("target_uid"); // 兜底逻辑,防止没传参的异常场景 if (profileId == null) { profileId = fUser.getUid(); }
3. 为Fragment添加入参传递逻辑
给所有ViewPager内的Fragment添加newInstance静态方法,用来接收传递的profileId,不要让Fragment自己去读SP。
修改Profile碎片:
// 新增静态newInstance方法 public static Profile newInstance(String profileId) { Profile fragment = new Profile(); Bundle args = new Bundle(); args.putString("profile_id", profileId); fragment.setArguments(args); return fragment; } // onCreateView中删除读SP的代码,替换为读Arguments @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // ... 原有初始化逻辑 fUser = FirebaseAuth.getInstance().getCurrentUser(); // 读入参 if (getArguments() != null) { profileId = getArguments().getString("profile_id"); } // 兜底逻辑 if (profileId == null) { profileId = fUser.getUid(); } // ... 原有后续逻辑 }
修改MyPosts碎片:
和Profile碎片修改逻辑完全一致,添加newInstance方法,onCreateView中读Arguments即可。
修改SavedPosts碎片:
同上,添加newInstance方法,内部读取传入的profileId。
4. 修改ProfileActivity中ViewPager初始化逻辑
创建Fragment实例时用新增的newInstance方法,把activity拿到的profileId传递进去:
VPAdapter vpAdapter = new VPAdapter(getSupportFragmentManager(), FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); vpAdapter.addFragment(Profile.newInstance(profileId), "Profile"); vpAdapter.addFragment(MyPosts.newInstance(profileId), "Posts"); if (profileId.equals(fUser.getUid())){ vpAdapter.addFragment(SavedPosts.newInstance(profileId), "Saved"); } viewPager.setAdapter(vpAdapter);
修改完成后所有参数都是通过组件原生的通信方式直接传递,没有全局缓存的读写冲突,点击哪个用户就会展示对应的用户资料。
内容的提问来源于stack exchange,提问作者solo_boy
相关产品推荐
相关产品推荐

