如何根据用户类型/角色设置活动布局?

时间:2019-05-31 22:15:22

标签: android database firebase user-interface roles

我正在使用具有两种类型的用户(医生和患者)的Android应用程序,并且我希望每种类型都有自己的UI。例如,医生必须看到“加班假”,而患者必须看到“预约书”。无论如何我都无法做到。

我还使用Firebase身份验证和实时数据库,这使得用户类型检索有点棘手。到目前为止,我已经在启动器启动屏幕上尝试了许多Async类,方法,变量,共享首选项,检索数据。

我得到的最好的结果就是让用户登录,它显示了良好的布局,然后再次启动该应用程序,并显示了错误的布局。不知何故,我注意到它仅在第二轮运行时有效,但并非总是如此,因此至少对于我来说,行为是不可预测的。但是至少可以从数据库中检索用户类型。

  1. 我有一个扩展Application的类,该类检查是否有经过身份验证的用户,然后将用户重定向到LoginActivity或MainMenuActivity。

  2. 我创建了一种方法,该方法可从实时数据库中检索Firebase Auth用户数据,遍历Doctors和Patient的“子代”,直到找到当前用户的电子邮件并获取其类型。由于实时数据库是异步的,因此方法将接口作为参数,然后在循环后,我调用接口的方法,该方法设置了静态布尔变量(isUserDoctor)。

  3. 在设置内容视图(具有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,以设置整个应用所需的变量,以便隐藏/显示某些视图。

0 个答案:

没有答案