如何获取Facebook用户信息并通过SharedPreferences在其他Activity中使用
嘿,你已经搞定了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
相关产品推荐
相关产品推荐

