You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android答题应用跳题Bug:答对题目时跳过下一题

问题排查与修复方案

我一眼就发现问题所在了——你的if-else结构缺少花括号包裹,导致代码逻辑重复执行,才会出现答对后跳两题的情况!

问题根源

看你每个选项的点击事件代码:当选择正确答案时,if块里的Handler会执行一次mQuestionNumber++,但因为else后面没有用{}包裹所有后续代码,sco.setText(...)和第二个Handler代码会不管if条件是否成立都会执行。这就导致mQuestionNumber被连续加了两次,比如当前是第2题,执行后直接变成4,自然跳过了第3题。

而选择错误答案时,else块只执行了设置红色背景的代码,之后执行的Handler只会加一次mQuestionNumber,所以跳转正常。

修复后的代码

首先给else加上花括号,把所有属于错误分支的代码包裹进去;另外还可以把重复的延迟跳转逻辑提取成一个方法,减少代码冗余:

private void updateQuestion() {
    mDatabaseReference.child("Users").child(RecieversId).child("Quiz").child("Question" + mQuestionNumber).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String question = dataSnapshot.child("Question").getValue().toString();
            answer = dataSnapshot.child("Answer").getValue().toString();
            option1 = dataSnapshot.child("Option1").getValue().toString();
            option2 = dataSnapshot.child("Option2").getValue().toString();
            option3 = dataSnapshot.child("Option3").getValue().toString();
            option4 = dataSnapshot.child("Option4").getValue().toString();
            que.setText(question);
            opt1.setText(option1);
            opt2.setText(option2);
            opt3.setText(option3);
            opt4.setText(option4);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });

    opt1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (option1.equals(answer)) {
                opt1.setBackgroundColor(Color.GREEN);
                mScore++;
                sco.setText("Score : " + mScore);
            } else {
                opt1.setBackgroundColor(Color.RED);
            }
            // 提取重复的延迟跳转逻辑到单独方法
            navigateToNextQuestion(opt1);
        }
    });

    opt2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (option2.equals(answer)) {
                opt2.setBackgroundColor(Color.GREEN);
                mScore++;
                sco.setText("Score : " + mScore);
            } else {
                opt2.setBackgroundColor(Color.RED);
            }
            navigateToNextQuestion(opt2);
        }
    });

    opt3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (option3.equals(answer)) {
                opt3.setBackgroundColor(Color.GREEN);
                mScore++;
                sco.setText("Score : " + mScore);
            } else {
                opt3.setBackgroundColor(Color.RED);
            }
            navigateToNextQuestion(opt3);
        }
    });

    opt4.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (option4.equals(answer)) {
                opt4.setBackgroundColor(Color.GREEN);
                mScore++;
                sco.setText("Score : " + mScore);
            } else {
                opt4.setBackgroundColor(Color.RED);
            }
            navigateToNextQuestion(opt4);
        }
    });
}

// 提取的延迟跳转方法
private void navigateToNextQuestion(final View optionView) {
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            mQuestionNumber++;
            qn.setText("Question : " + mQuestionNumber);
            updateQuestion();
            optionView.setBackgroundColor(Color.CYAN);
        }
    }, 1500);
}

优化说明

  1. 修复if-else结构:给每个else分支加上{},确保错误分支的代码只在条件不成立时执行,避免重复执行Handler逻辑。
  2. 提取公共方法:把重复的延迟跳转、更新题号等逻辑放到navigateToNextQuestion方法里,减少代码冗余,也方便后续维护。

这样修改后,不管答对还是答错,mQuestionNumber只会被加一次,就能正常跳转到下一题啦!

内容的提问来源于stack exchange,提问作者user9646251

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:30:07