java - 如何根据 boolean 变量决定抽屉导航 fragment 的 View ?

标签 java android firebase android-fragments google-cloud-firestore

我遇到了问题,但不知道如何解决。我正在自学 Android,现在我正在使用抽屉导航与我的应用程序的一部分进行交互。我想要的是,当我从 NavigationActivity 中选择 questionItem 时,我想根据 Firebase Firestore 中存储的 boolean 变量返回一个 View。我知道 Firebase 上的查询是异步的,这就是为什么始终返回 no_question 布局的原因,即使存储的变量的值是 true 也是如此。但我不知道如何解决它,如果有人帮助我找到解决方案,我将非常感激。我尝试了很多解决方案,例如使用线程同步或 hibernate 主线程,但它不起作用。

这是我的代码:

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();
                        }
                    });
    }
}

最佳答案

简单地分配question_act[0] = qNova;没有任何区别。正如您在问题中已经提到的,Firebase API 是异步的,因此在回调之外使用 qNova 的值将永远工作。

您唯一的选择是仅在 activacioRebuda() 方法中使用 qNova 的值来等待数据,因为您非常确定从数据库获取数据的操作已100%完成。

要获得有效的解决方案,请参阅以下帖子中我的回答:

关于java - 如何根据 boolean 变量决定抽屉导航 fragment 的 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60999215/

相关文章:

java - 如何在Java中将数组长度设置为字符串的大小并从字符串中引入字符

java - 在 Cpanel Server 中部署多个 Tomcat 应用程序时的内存泄漏问题

java - 我应该将 java Stream.map 函数与 switch 语句一起使用吗?

java - “Using non reentrant iterator method: Array.iterator()” 错误消息是什么意思?

android - 每次查询/写入后关闭 Realm 实例是否可以?

android - 错误 :Failed to resolve: support-vector-drawable

java - 将数据存储到 hashmap

python-3.x - 有没有办法从 firebase 应用程序分发中以编程方式下载应用程序?

javascript - 当应用程序最小化/关闭时更新 Firestore 值

javascript - 更新firestore中文档的createdAt和updatedAt日期字段的正确方法是什么?