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); }
优化说明
- 修复if-else结构:给每个else分支加上
{},确保错误分支的代码只在条件不成立时执行,避免重复执行Handler逻辑。 - 提取公共方法:把重复的延迟跳转、更新题号等逻辑放到
navigateToNextQuestion方法里,减少代码冗余,也方便后续维护。
这样修改后,不管答对还是答错,mQuestionNumber只会被加一次,就能正常跳转到下一题啦!
内容的提问来源于stack exchange,提问作者user9646251
相关产品推荐
相关产品推荐

