微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么一次只调用一次,TextViews中的文本会更改两次?

如何解决为什么一次只调用一次,TextViews中的文本会更改两次?

我知道setText仅更改了一次文本,但是在进入quizActivity

中的下一个问题之前,我似乎找不到其变化的原因。 >

我制作的是一个其中有一个活动的应用程序,里面有一个测验,一个问题和4个选项一起显示。当用户选择一个选项时,如果该选项正确,那么它将变为绿色和红色,此外,然后我打开一个对话框,显示答案是对还是错,然后在用户单击{{1}时更改问题}。

但是,当用户选择一个选项时,在单击该选项然后在对话框中单击“下一步”的过程中,问题和选项中的文本发生了变化,我似乎无法弄清楚这是怎么回事为什么会这样。总的来说,问题和选项只应更改一次,而更改两次。意外更改是用户单击选项并打开对话框时。

Here is a video that describes the issue

这是代码

Next

这是检查答案的功能

@Override
    public void onClick(View view) {

        int selectedOption = 0;

        switch (view.getId()) {

            case R.id.option_1_tile:
                selectedOption = 1;
                break;
            case R.id.option_2_tile:
                selectedOption = 2;
                break;
            case R.id.option_3_tile:
                selectedOption = 3;
                break;
            case R.id.option_4_tile:
                selectedOption = 4;
                break;

            default:

        }

        checkAnswer(selectedOption,view);
    }

这是更改问题的函数

private void checkAnswer(int selectedOption,View view) {

        if (selectedOption == selected_questions.get(quesNum).getAnswer()) {
            //Right Answer
            (view).setBackgroundTintList(ColorStateList.valueOf(Color.GREEN));
            quizReference.child(selected_questions.get(quesNum).getId()).child("correct_attempts").setValue(String.valueOf(Integer.valueOf(selected_questions.get(quesNum).getCorrect_attempts()) + 1));
            quizReference.child(selected_questions.get(quesNum).getId()).child("total_attempts").setValue(String.valueOf(Integer.valueOf(selected_questions.get(quesNum).getTotal_attempts()) + 1));
            score++;
            correctDialog();

        } else {
            //Wrong Answer
            (view).setBackgroundTintList(ColorStateList.valueOf(Color.RED));

            quizReference.child(selected_questions.get(quesNum).getId()).child("total_attempts").setValue(String.valueOf(Integer.valueOf(selected_questions.get(quesNum).getTotal_attempts()) + 1));

            switch (selected_questions.get(quesNum).getAnswer()) {
                case 1:
                    options[0].setBackgroundTintList(ColorStateList.valueOf(Color.GREEN));
                    break;
                case 2:
                    options[1].setBackgroundTintList(ColorStateList.valueOf(Color.GREEN));
                    break;
                case 3:
                    options[2].setBackgroundTintList(ColorStateList.valueOf(Color.GREEN));
                    break;
                case 4:
                    options[3].setBackgroundTintList(ColorStateList.valueOf(Color.GREEN));
                    break;

            }

            wrongDialog ();

        }


    }

这是设置文本和动画的功能

 private void changeQuestion() {
    
            resetColor ();
    
            if (quesNum < selected_questions.size() - 1) {
    
                quesNum++;
    
                playAnim(question,0);
                playAnim(option1_text,1);
                playAnim(option2_text,2);
                playAnim(option3_text,3);
                playAnim(option4_text,4);
    
                qCount.setText(String.valueOf(quesNum + 1) + "/" + String.valueOf(selected_questions.size()));
    
    
            } else {
                // Go to score Activity
                Intent intent = new Intent(quizActivity.this,scoreActivity.class);
                intent.putExtra("score",String.valueOf(score) + "/" + String.valueOf(selected_questions.size()));
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                startActivity(intent);
    
            }
    
    
        }

以下是对话框的代码

private void playAnim(final View view,final int value,final int viewNum) {
        view.animate().alpha(value).scaleX(value).scaleY(value).setDuration(500)
                .setStartDelay(100).setInterpolator(new DecelerateInterpolator())
                .setListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationStart(Animator animation) {

                    }

                    @Override
                    public void onAnimationEnd(Animator animation) {
                        if (value == 0) {
                            switch (viewNum) {
                                case 0:
                                    ((TextView) view).setText(selected_questions.get(quesNum).getQuestion());
                                    break;
                                case 1:
                                    ((TextView) view).setText(selected_questions.get(quesNum).getoption1());
                                    break;
                                case 2:
                                    ((TextView) view).setText(selected_questions.get(quesNum).getoption2());
                                    break;
                                case 3:
                                    ((TextView) view).setText(selected_questions.get(quesNum).getoption3());
                                    break;
                                case 4:
                                    ((TextView) view).setText(selected_questions.get(quesNum).getoption4());
                                    break;

                            }


                            if (viewNum != 0)
                                (view).setBackgroundTintList(ColorStateList.valueOf(Color.parseColor("#E99C03")));


                            playAnim(view,1,viewNum);

                        }

                    }

                    @Override
                    public void onAnimationCancel(Animator animation) {

                    }

                    @Override
                    public void onAnimationRepeat(Animator animation) {

                    }
                });

    }

尽管我很乐意回答您可能需要的任何其他信息/代码,但我已尽力向您解释。此外,如果您有时间运行该项目is the link,并且可以更好地了解问题,则可以使用。{p>

解决方法

我已经检查了您的代码。您已在setUpdates方法中放置了addValueEventListener。选择选项后,您可以通过设置总尝试次数等字段来更新Firestore数据库。结果,事件监听器被触发,并调用了“ selectQuestionSet”函数。

因此,每次选择一个选项时,都会调用selectQuestionSet函数。您应该确保它一开始只被调用一次。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。