我正在使用具有两种类型的用户(医生和患者)的Android应用程序,并且我希望每种类型都有自己的UI。例如,医生必须看到“加班假”,而患者必须看到“预约书”。无论如何我都无法做到。
我还使用Firebase身份验证和实时数据库,这使得用户类型检索有点棘手。到目前为止,我已经在启动器启动屏幕上尝试了许多Async类,方法,变量,共享首选项,检索数据。
我得到的最好的结果就是让用户登录,它显示了良好的布局,然后再次启动该应用程序,并显示了错误的布局。不知何故,我注意到它仅在第二轮运行时有效,但并非总是如此,因此至少对于我来说,行为是不可预测的。但是至少可以从数据库中检索用户类型。
我有一个扩展Application的类,该类检查是否有经过身份验证的用户,然后将用户重定向到LoginActivity或MainMenuActivity。
我创建了一种方法,该方法可从实时数据库中检索Firebase Auth用户数据,遍历Doctors和Patient的“子代”,直到找到当前用户的电子邮件并获取其类型。由于实时数据库是异步的,因此方法将接口作为参数,然后在循环后,我调用接口的方法,该方法设置了静态布尔变量(isUserDoctor)。
在设置内容视图(具有2种可能的布局)之前,我调用了前面描述的函数,并且该函数以我初次提到的方式工作,效果不好。
检索数据的方法
public void getUserType(final DataStatus dataStatus) {
currentUser = FirebaseAuth.getInstance().getCurrentUser();
currentUserEmail = currentUser.getEmail();
databaseReference = FirebaseDatabase.getInstance().getReference("Users");
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
currentUserType.clear();
FirebaseManager.isUserDoctor = false;
DataSnapshot allDoctors = dataSnapshot.child("Doctors");
DataSnapshot allPatients = dataSnapshot.child("Patients");
for (DataSnapshot ds : allDoctors.getChildren()) {
if (currentUserEmail.equals(Utils.decodeUserEmail(ds.getKey()))) {
currentUserType.add(ds.child("userType").getValue().toString());
} else {
for (DataSnapshot dsPacient : allPatients.getChildren()) {
if (currentUserEmail.equals(Utils.decodeUserEmail(dsPacient.getKey()))) {
currentUserType.add(dsPacient.child("userType").getValue().toString());
}
}
}
}
dataStatus.DataIsLoaded(currentUserType.get(0).toString());
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
界面
public interface DataStatus {
void DataIsLoaded(String userType);
}
在主菜单中调用方法
FirebaseManager.getInstance().getUserType(new DataStatus() {
@Override
public void DataIsLoaded(String userType) {
if ("doctor".equals(userType))
FirebaseManager.isUserDoctor = true;
else
FirebaseManager.isUserDoctor = false;
}
});
if (FirebaseManager.isUserDoctor)
setContentView(R.layout.activity_main_menu_doctor);
else
setContentView(R.layout.activity_main_menu);
因此,如果任何人对如何显示正确的布局以及允许基于用户角色/类型的功能有任何想法,请分享。我基本上需要的是及时从当前电子邮件中检索userType,以设置整个应用所需的变量,以便隐藏/显示某些视图。