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

DrawerMenu开发求助:Firebase用户信息加载与角色化菜单显示

解决方案:DrawerMenu用户信息展示与角色权限菜单控制

一、从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:40:20