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

如何获取Facebook用户信息并通过SharedPreferences在其他Activity中使用

在导航抽屉Activity中读取并展示SharedPreferences中的用户信息

嘿,你已经搞定了Facebook登录和数据存储这两块核心工作,接下来在Index页面的导航抽屉里展示用户信息其实很简单,我给你一步步梳理:

第一步:先明确你存储数据的方式

首先得确认你在MainActivity里是怎么把用户Profile存到SharedPreferences的——因为SharedPreferences本身不能直接存ArrayList,大概率你是用Gson把ArrayList(或者其实是单个User对象?毕竟一个用户的信息是单条数据,用ArrayList有点多余)转成JSON字符串存进去的。

假设你是这么存的(用Gson序列化):

// MainActivity里存储数据的示例
Gson gson = new Gson();
// 如果是单个User对象,直接序列化对象即可:gson.toJson(user)
String userProfileJson = gson.toJson(userProfileList); 
SharedPreferences sp = getSharedPreferences("UserPrefs", MODE_PRIVATE);
sp.edit().putString("user_profile", userProfileJson).apply();

如果是单独存每个字段的话(比如分别存id、name、email、avatarUrl),那读取起来更直接:

// MainActivity单独存字段的示例
SharedPreferences sp = getSharedPreferences("UserPrefs", MODE_PRIVATE);
sp.edit()
   .putString("user_id", userId)
   .putString("user_name", userName)
   .putString("user_email", userEmail)
   .putString("user_avatar", avatarUrl)
   .apply();

第二步:在Index Activity中读取数据

情况1:你存的是JSON字符串(ArrayList或单个对象)

首先要添加Gson依赖(如果还没加的话,在app/build.gradle里):

implementation 'com.google.code.gson:gson:2.10.1'

然后在Index的onCreate方法里读取并解析:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_index);

    // 1. 获取SharedPreferences实例
    SharedPreferences sp = getSharedPreferences("UserPrefs", MODE_PRIVATE);
    String userProfileJson = sp.getString("user_profile", null);

    if (userProfileJson == null) {
        // 没有用户数据,跳回登录页面
        startActivity(new Intent(this, MainActivity.class));
        finish();
        return;
    }

    // 2. 解析JSON:如果是ArrayList<User>
    Gson gson = new Gson();
    Type type = new TypeToken<ArrayList<User>>(){}.getType();
    ArrayList<User> userProfileList = gson.fromJson(userProfileJson, type);
    User currentUser = userProfileList.get(0); // 取列表中第一个用户(单用户场景下只有一条数据)

    // 如果是单个User对象的话,解析更简单:
    // User currentUser = gson.fromJson(userProfileJson, User.class);

    // 3. 绑定到导航抽屉的UI组件
    setupNavigationDrawer(currentUser);
}

情况2:你是单独存每个字段的

这种情况读取更直接:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_index);

    SharedPreferences sp = getSharedPreferences("UserPrefs", MODE_PRIVATE);
    String userId = sp.getString("user_id", null);
    String userName = sp.getString("user_name", null);
    String userEmail = sp.getString("user_email", null);
    String avatarUrl = sp.getString("user_avatar", null);

    if (userId == null) {
        // 无数据,跳回登录
        startActivity(new Intent(this, MainActivity.class));
        finish();
        return;
    }

    // 绑定UI
    setupNavigationDrawer(userId, userName, userEmail, avatarUrl);
}

第三步:绑定数据到导航抽屉的UI组件

接下来写setupNavigationDrawer方法,找到侧边栏的TextView和ImageView,设置内容:

private void setupNavigationDrawer(User user) {
    // 获取导航抽屉的视图(假设你的导航抽屉头部布局是nav_header_index.xml)
    NavigationView navigationView = findViewById(R.id.nav_view);
    View headerView = navigationView.getHeaderView(0);

    // 找到UI组件
    TextView tvName = headerView.findViewById(R.id.tv_nav_name);
    TextView tvEmail = headerView.findViewById(R.id.tv_nav_email);
    ImageView ivAvatar = headerView.findViewById(R.id.iv_nav_avatar);

    // 设置文本内容
    tvName.setText(user.getName());
    tvEmail.setText(user.getEmail());

    // 加载头像(用Glide,需要添加依赖)
    // 在app/build.gradle添加:implementation 'com.github.bumptech.glide:glide:4.15.1'
    Glide.with(this)
         .load(user.getAvatarUrl())
         .circleCrop() // 圆形头像,符合社交平台风格
         .placeholder(R.drawable.default_avatar) // 加载中的占位图
         .into(ivAvatar);
}

// 如果是单独传字段的版本:
private void setupNavigationDrawer(String userId, String userName, String userEmail, String avatarUrl) {
    NavigationView navigationView = findViewById(R.id.nav_view);
    View headerView = navigationView.getHeaderView(0);

    TextView tvName = headerView.findViewById(R.id.tv_nav_name);
    TextView tvEmail = headerView.findViewById(R.id.tv_nav_email);
    ImageView ivAvatar = headerView.findViewById(R.id.iv_nav_avatar);

    tvName.setText(userName);
    tvEmail.setText(userEmail);

    Glide.with(this)
         .load(avatarUrl)
         .circleCrop()
         .placeholder(R.drawable.default_avatar)
         .into(ivAvatar);
}

几个要注意的细节

  • 别忘了添加网络权限,在AndroidManifest.xml里:<uses-permission android:name="android.permission.INTERNET" />,不然头像加载不出来。
  • 处理用户未登录的情况:如果SharedPreferences里没有数据,直接跳回登录页面,避免空指针异常。
  • 如果你没用Glide,也可以用Picasso,用法类似:Picasso.get().load(avatarUrl).placeholder(R.drawable.default_avatar).into(ivAvatar);,记得添加Picasso依赖。

内容的提问来源于stack exchange,提问作者Pedro Cañibano Zuñiga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:10:49