vvv12
vvv12

Reputation: 13

Android CountDown Timer in Quiz Application

I have made a quiz application which include 5 questions. I have made a ResultActivity page which displays result of the quiz. I have added a countDown timer of 20 sec for each question. When the Countdown timer finishes it moves to the next question automatically. When the questions are finished it should move to the ResultActivity page to display result.

I have only one issue... Afetr reaching my last Question..if i does not select any answer and timer is finished the applicaton is not moving to my ResultActivity page..The timer is getting started again and again on the same question until i select any option

Here is my code:

QuizActivity.java

package com.example.triviality;
import java.util.LinkedHashMap;
import java.util.List;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

public class QuizActivity extends Activity {
    List<question> quesList;
    public static int score, correct, wrong, wronganswers;
    public boolean isCorrect;
    static int qid = 0;
    int totalCount = 5;
    Question currentQ;
    TextView txtQuestion;
    RadioGroup radioGroup1;
    RadioButton rda, rdb, rdc;
    Button butNext;
    TextView rt;
    boolean nextFlag = false;
    boolean isTimerFinished = false;
    static LinkedHashMap lhm = new LinkedHashMap();
    MyCountDownTimer countDownTimer = new MyCountDownTimer(10000 /* 20 Sec */,
            1000);
    // final MyCountDownTimer timer = new MyCountDownTimer(20000,1000);
    public static String[] Correctanswers = new String[5];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_quiz);
        DbHelper db = new DbHelper(this);
        quesList = db.getAllQuestions();
        currentQ = quesList.get(qid);
        txtQuestion = (TextView) findViewById(R.id.textView1);
        rda = (RadioButton) findViewById(R.id.radio0);
        rdb = (RadioButton) findViewById(R.id.radio1);
        rdc = (RadioButton) findViewById(R.id.radio2);
        butNext = (Button) findViewById(R.id.button1);
        // radioGroup1=(RadioGroup)findViewById(R.id.radioGroup1);
        setQuestionView();
        // timer.start();
        rt = (TextView) findViewById(R.id.rt);
        rt.setText("20");
        countDownTimer.start();
        butNext.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                countDownTimer.cancel();
                if (getNextQuestion(false)) {
                    // Start The timer again
                    countDownTimer.start();
                }
            }
        });
    }
    private void setQuestionView() {
        txtQuestion.setText(currentQ.getQUESTION());
        rda.setText(currentQ.getOPTA());
        rdb.setText(currentQ.getOPTB());
        rdc.setText(currentQ.getOPTC());
    }

    public class MyCountDownTimer extends CountDownTimer {
        public MyCountDownTimer(long startTime, long interval) {
            super(startTime, interval);
        }

        public void onFinish() {
            Log.e("Times up", "Times up");
            countDownTimer.cancel();
            if (getNextQuestion(false)) {
                // Start The timer again
                countDownTimer.start();
            }
        }
        @Override
        public void onTick(long millisUntilFinished) {
            rt.setText((millisUntilFinished / 1000) + "");
            Log.e("Second Gone", "Another Second Gone");
            Log.e("Time Remaining", "seconds remaining: " + millisUntilFinished
                    / 1000);
        }
    }
    boolean getNextQuestion(boolean c) {
        nextFlag = true;
        RadioGroup grp = (RadioGroup) findViewById(R.id.radioGroup1);
        // grp.clearCheck();
        RadioButton answer = (RadioButton) findViewById(grp
                .getCheckedRadioButtonId());
        if (rda.isChecked() || rdb.isChecked() || rdc.isChecked()) {
            qid++;
            Log.d("yourans", currentQ.getANSWER() + " " + answer.getText());
            grp.clearCheck();
            // wronganswers=
            if (!c && currentQ.getANSWER().equals(answer.getText())) {
                correct++;
            } else {
                lhm.put(currentQ.getQUESTION(), currentQ.getANSWER());
                wrong++;
            }

            if (qid < 5) {
                currentQ = quesList.get(qid);
                setQuestionView();

            } else {

                score = correct;
                Intent intent = new Intent(QuizActivity.this,
                        ResultActivity.class);
                Bundle b = new Bundle();
                b.putInt("score", score); // Your score
                intent.putExtras(b); // Put your score to your next Intent
                startActivity(intent);
                return false;
            }
        } else {
            lhm.put(currentQ.getQUESTION(), currentQ.getANSWER());
            qid++;

            if (qid < 5) {  
                currentQ = quesList.get(qid);
                //currentQ.getANSWER().equals(wrong);
                wrong++;
                Log.e("yourans", currentQ.getANSWER());
                setQuestionView();

            }
            // wrong++;
            // Log.e("Without Any Selection ", "without  "+wrong);
            // Toast.makeText(getApplicationContext(),
            // "Please select atleast one Option",Toast.LENGTH_SHORT).show();

        }

        return true;
    }
}




ResultActivity.java:

package com.example.triviality;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class ResultActivity extends Activity {
    Button restart;
    Button check;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_result);

        TextView t=(TextView)findViewById(R.id.textResult);
        TextView t1=(TextView)findViewById(R.id.textResult1);
        TextView t2=(TextView)findViewById(R.id.textResult2);
        restart=(Button)findViewById(R.id.restart);
        check=(Button)findViewById(R.id.check);

        StringBuffer sb=new StringBuffer();
        sb.append("Correct ans: "+QuizActivity.correct+"\n");
        StringBuffer sc=new StringBuffer();
        sc.append("Wrong ans : "+QuizActivity.wrong+"\n");
        StringBuffer sd=new StringBuffer();
        sd.append("Final Score : "+QuizActivity.score);
        t.setText(sb);
        t1.setText(sc);
        t2.setText(sd);
        QuizActivity.correct=0;
        QuizActivity.wrong=0;


        check.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                // TODO Auto-generated method stub
                Intent in=new Intent(getApplicationContext(),CheckActivity.class);
                startActivity(in);  
            }
        });

restart.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                //QuizActivity quiz=new QuizActivity();

                // TODO Auto-generated method stub
                Intent intent=new Intent(getApplicationContext(),QuizActivity.class);

                QuizActivity.lhm.clear();
                QuizActivity.qid=0;
                startActivity(intent);
                //quiz.countDownTimer.onTick(19);   
            }
        });
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_result, menu);
        return true;
    }
}

Upvotes: 0

Views: 2130

Answers (1)

Opiatefuchs
Opiatefuchs

Reputation: 9870

This is because Your return false statement will never be reached if the user has made no choice:

    if (rda.isChecked() || rdb.isChecked() || rdc.isChecked()){}

in this if else statement You will return false later. But if none is selected, You automatically will return true because the code block inside this statement above will not be rached. And then in Your timer You say:

    if (getNextQuestion(false)) {
            // Start The timer again
            countDownTimer.start();
        }

getNextQuestion is allways true if the user makes no choice, so the timer starts again and again.

Upvotes: 0

Related Questions