DrawerMenu开发求助:Firebase用户信息加载与角色化菜单显示
一、从Firebase加载用户头像和姓名到抽屉头部
步骤1:获取Drawer头部视图组件
在setContentView方法中,通过NavigationView获取头部布局的控件:
// 获取NavigationView的头部视图 View headerView = navigationView.getHeaderView(0); nome_perfil = headerView.findViewById(R.id.nome_perfil); // 对应你头部布局的TextView ID imagem_perfil = headerView.findViewById(R.id.imagem_perfil); // 对应头部布局的ImageView ID user_email = headerView.findViewById(R.id.user_email); // 如果需要显示邮箱
步骤2:从Firebase获取用户数据
情况1:使用Firebase Auth的基本用户信息
如果仅需Auth自带的用户信息:
FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser(); if (currentUser != null) { // 设置用户名,为空时显示默认文本 nome_perfil.setText(currentUser.getDisplayName() != null ? currentUser.getDisplayName() : "匿名用户"); // 设置头像(如果用户有设置头像URL) if (currentUser.getPhotoUrl() != null) { // 用Glide加载网络图片并裁剪为圆形 Glide.with(this) .load(currentUser.getPhotoUrl()) .circleCrop() .into(imagem_perfil); } // 设置邮箱 user_email.setText(currentUser.getEmail()); }
情况2:从Firestore获取自定义用户信息
如果用户详细信息存在Firestore的users集合:
FirebaseFirestore db = FirebaseFirestore.getInstance(); String userId = FirebaseAuth.getInstance().getCurrentUser().getUid(); db.collection("users").document(userId) .get() .addOnSuccessListener(documentSnapshot -> { if (documentSnapshot.exists()) { Usuario usuario = documentSnapshot.toObject(Usuario.class); if (usuario != null) { nome_perfil.setText(usuario.getNome()); user_email.setText(usuario.getEmail()); // 加载自定义头像 if (!TextUtils.isEmpty(usuario.getFotoUrl())) { Glide.with(this) .load(usuario.getFotoUrl()) .circleCrop() .into(imagem_perfil); } } } }) .addOnFailureListener(e -> { // 加载失败时显示默认内容 nome_perfil.setText("未知用户"); imagem_perfil.setImageResource(R.drawable.default_avatar); });
需要给项目添加Glide依赖(在build.gradle的dependencies中):
implementation 'com.github.bumptech.glide:glide:4.16.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0'
步骤3:处理未登录或加载失败场景
初始化时设置默认占位,避免UI异常:
nome_perfil.setText("加载中..."); imagem_perfil.setImageResource(R.drawable.default_avatar);
二、根据用户角色(ADMIN/普通用户)展示不同菜单选项
步骤1:在菜单文件中默认隐藏管理员专属项
修改main_drawer_menu.xml,给管理员菜单项添加默认隐藏属性:
<item android:id="@+id.menu_add" android:title="添加作品" android:visible="false"/> <item android:id="@+id.menu_addhist" android:title="添加历史" android:visible="false"/> <item android:id="@+id.menu_addalbum" android:title="添加相册" android:visible="false"/> <item android:id="@+id.menu_addnoticias" android:title="添加新闻" android:visible="false"/>
步骤2:获取用户角色并动态控制菜单显示
从Firebase拿到用户角色后,批量设置菜单项可见性:
private void updateMenuBasedOnRole(String role) { Menu menu = navigationView.getMenu(); boolean isAdmin = "ADMIN".equals(role); // 批量设置管理员菜单项的可见性 menu.findItem(R.id.menu_add).setVisible(isAdmin); menu.findItem(R.id.menu_addhist).setVisible(isAdmin); menu.findItem(R.id.menu_addalbum).setVisible(isAdmin); menu.findItem(R.id.menu_addnoticias).setVisible(isAdmin); }
在获取用户信息的回调中调用这个方法:
// 接前面Firestore获取用户信息的代码 if (usuario != null) { // ... 其他UI更新逻辑 updateMenuBasedOnRole(usuario.getRole()); }
步骤3:失败降级处理
如果角色加载失败,默认按普通用户处理:
.addOnFailureListener(e -> { // ... 其他失败处理逻辑 updateMenuBasedOnRole("USER"); });
整合后的完整代码片段
在setContentView方法末尾添加以下逻辑:
@Override public void setContentView(View view) { drawerLayout = (DrawerLayout) getLayoutInflater().inflate(R.layout.activity_drawer_base, null); FrameLayout container = drawerLayout.findViewById(R.id.activityContainer); container.addView(view); super.setContentView(drawerLayout); Toolbar toolbar = drawerLayout.findViewById(R.id.toolBar); setSupportActionBar(toolbar); NavigationView navigationView = drawerLayout.findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.menu_drawer_open, R.string.menu_drawer_close); drawerLayout.addDrawerListener(toggle); toggle.syncState(); // ---------------------- 新增逻辑 ---------------------- // 1. 绑定头部控件 View headerView = navigationView.getHeaderView(0); nome_perfil = headerView.findViewById(R.id.nome_perfil); imagem_perfil = headerView.findViewById(R.id.imagem_perfil); user_email = headerView.findViewById(R.id.user_email); // 设置默认占位 nome_perfil.setText("加载中..."); imagem_perfil.setImageResource(R.drawable.default_avatar); // 2. 获取用户信息并更新UI和菜单 FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser(); if (currentUser != null) { FirebaseFirestore db = FirebaseFirestore.getInstance(); db.collection("users").document(currentUser.getUid()) .get() .addOnSuccessListener(documentSnapshot -> { if (documentSnapshot.exists()) { Usuario usuario = documentSnapshot.toObject(Usuario.class); if (usuario != null) { nome_perfil.setText(usuario.getNome()); user_email.setText(usuario.getEmail()); if (!TextUtils.isEmpty(usuario.getFotoUrl())) { Glide.with(this) .load(usuario.getFotoUrl()) .circleCrop() .into(imagem_perfil); } updateMenuBasedOnRole(usuario.getRole()); } } }) .addOnFailureListener(e -> { nome_perfil.setText("未知用户"); imagem_perfil.setImageResource(R.drawable.default_avatar); updateMenuBasedOnRole("USER"); }); } } // 菜单角色控制方法 private void updateMenuBasedOnRole(String role) { Menu menu = navigationView.getMenu(); boolean isAdmin = "ADMIN".equals(role); menu.findItem(R.id.menu_add).setVisible(isAdmin); menu.findItem(R.id.menu_addhist).setVisible(isAdmin); menu.findItem(R.id.menu_addalbum).setVisible(isAdmin); menu.findItem(R.id.menu_addnoticias).setVisible(isAdmin); }
内容的提问来源于stack exchange,提问作者Sergio Mendes
相关产品推荐
相关产品推荐

