Как выбрать вид фрагмента навигационной панели в зависимости от логической переменной? - PullRequest
0 голосов
/ 02 апреля 2020

У меня проблема, и я не знаю, как ее решить. Я изучаю Android для себя, и теперь я использую Навигационный ящик для взаимодействия с частью моего приложения. Что я хочу, так это когда я выбираю questionItem из NavigationActivity, я хочу вернуть View в зависимости от логической переменной, хранящейся в Firebase Firestore. Я знаю, что запросы в Firebase являются асинхронными, и поэтому макет no_question возвращается всегда, даже если значение хранимой переменной равно true. Но я не знаю, как ее решить, и буду очень признателен, если кто-нибудь поможет мне найти решение. Я пробовал множество решений, таких как использование потоков для синхронизации или спящий основной поток, но он не работает.

Вот мой код:

public class QuestionFragment extends Fragment {

    private View root;

    private boolean[] question_act = new boolean[1];

    public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {

        isQuestion_act(new Callback() {
            @Override
            public void activacioRebuda(final boolean qNova) {
                question_act[0] = qNova;
            }
        });

        if (question_act[0]) root = inflater.inflate(R.layout.fragment_question, container, false);
        else root = inflater.inflate(R.layout.fragment_noquestion, container, false);

        return root;
    }

    public interface Callback {
        void activacioRebuda(final boolean question);
    }

    private void isQuestion_act(Callback callback) {

            FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
            assert user != null;
            String id = user.getUid();

            FirebaseFirestore db = FirebaseFirestore.getInstance();

            db.collection("players")
                    .whereEqualTo("Id", id).whereEqualTo("Question_act", true)
                    .get()
                    .addOnCompleteListener(task -> {
                        if (task.isSuccessful()) {
                            for (QueryDocumentSnapshot document : Objects.requireNonNull(task.getResult())) {
                                Log.d(TAG, document.getId() + " => " + document.getData());
                                boolean q = document.getBoolean("Question_act");
                                Log.d(TAG, " question " + q);
                                if (callback != null) {
                                    callback.activacioRebuda(q);
                                }
                            }
                        } else {
                            Log.w(TAG, "Error getting documents.", task.getException());
                            Toast.makeText(getActivity(), "User does not exist", Toast.LENGTH_SHORT).show();
                        }
                    });
    }
}

1 Ответ

0 голосов
/ 03 апреля 2020

Простое назначение question_act[0] = qNova; не имеет никакого значения. Как вы уже упоминали в своем вопросе, Firebase API является асинхронным, поэтому использование значения qNova вне обратного вызова будет никогда работать.

Единственный вариант, который у вас есть, это ждать данные, используя значение qNova только внутри метода activacioRebuda(), так как вы уверены, что операция получения данных из базы данных выполнена на 100%.

Для рабочего решения, пожалуйста, см. мой ответ из следующего поста:

...