Я работаю над приложением для Android с двумя типами пользователей (врачами и пациентами) и хочу, чтобы у каждого типа был свой пользовательский интерфейс.Например, врачи должны увидеть «Добавить выходные», а пациенты - «Записаться на прием».Каким-то образом я ни к чему не обращаюсь.
Я также использую Firebase Auth и Realtime Database, что делает поиск типа пользователя довольно сложным.До сих пор я пробовал множество асинхронных классов, методов, переменных, общих настроек, извлекал данные, находясь на заставке запуска.
Лучшее, что я получил, - это заставить пользователя войти в систему, он показывает хороший макет, затем я снова запускаю приложение, и он показывает неправильный макет.Каким-то образом я заметил, что это работает только во втором запуске, но не всегда, поэтому поведение по крайней мере непредсказуемо для меня.Но, по крайней мере, тип пользователя из базы данных извлекается.
У меня есть класс, расширяющий Application, который проверяет, есть ли пользователь, прошедший проверку подлинности, а затем перенаправляет пользователя либо в LoginActivity, либо в MainMenuActivity..
Я создал метод, который извлекает пользовательские данные Firebase Auth из базы данных реального времени, циклически проходя по дочерним элементам «Доктора» и «Пациенты», пока не найдет текущее электронное письмо пользователя и не получит его тип.Поскольку база данных реального времени асинхронна, методы получают интерфейс в качестве аргумента, и после цикла я вызываю метод интерфейса, который устанавливает статическую логическую переменную (isUserDoctor).
Донастраивая представление контента (с двумя возможными макетами), я вызываю функцию, описанную выше, и она работает так, как я упоминал вначале, что не очень хорошо.
Метод, который извлекает данные
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 из текущего письма, чтобы установить переменную, необходимую во всем приложении, чтобы скрыть / показать определенные представления.