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

如何不使用SharedPreferences从Firebase Realtime Database获取当前及其他用户Uid

问题原因

你原来用SharedPreferences传递profileId的方案存在两个明显缺陷:

  1. 你在Profile碎片读取完SP后直接清空了SP内容,后续MyPosts等碎片读取时拿到的是默认值,自然只会显示当前登录用户的资料
  2. 跨页面传递临时参数用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:45:02