Pregunta

I am using countdown timer in my quiz game and i want score decremented when times up. And if someone answered it before times up score incremented. So i added call to currentGame.decrementScore() method in timers onFinsh() method. But when i answer my question correctly before times up its still decreasing score for time up plus increment score for correct answer. I also added call to one method in onFinsih() method to set up next question on times up and timer start again but its not working. Can sommeone tell me how to code this problem?

code:-

public class QuestionActivity extends Activity implements OnClickListener{

    private Question currentQ;
    private GamePlay currentGame;


     @Override
        public void onResume() {
            setTimer();
            super.onResume();
        }


         @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.question);
                /**
         * Configure current game and get question
         */
        currentGame = ((CYKApplication)getApplication()).getCurrentGame();
        currentQ = currentGame.getNextQuestion();
        Button nextBtn1 = (Button) findViewById(R.id.answer1);
        nextBtn1.setOnClickListener(this);
        Button nextBtn2 = (Button) findViewById(R.id.answer2);
        nextBtn2.setOnClickListener(this);
        Button nextBtn3 = (Button) findViewById(R.id.answer3);
        nextBtn3.setOnClickListener(this);
        Button nextBtn4 = (Button) findViewById(R.id.answer4);
        nextBtn4.setOnClickListener(this);
        Button nextBtn5 = (Button) findViewById(R.id.answer5);
        nextBtn5.setOnClickListener(this);
        /**
         * Update the question and answer options..
         */
        setQuestions();

    }


    /**
     * Method to set the text for the question and answers from the current games
     * current question
     */
    private void setQuestions() {
        //set the question text from current question
        String question = Utility.capitalise(currentQ.getQuestion());
        TextView qText = (TextView) findViewById(R.id.question);
        qText.setText(question);

        //set the available options
        List<String> answers = currentQ.getQuestionOptions();
        TextView option1 = (TextView) findViewById(R.id.answer1);
        option1.setText(Utility.capitalise(answers.get(0)));

        TextView option2 = (TextView) findViewById(R.id.answer2);
        option2.setText(Utility.capitalise(answers.get(1)));

        TextView option3 = (TextView) findViewById(R.id.answer3);
        option3.setText(Utility.capitalise(answers.get(2)));

        TextView option4 = (TextView) findViewById(R.id.answer4);
        option4.setText(Utility.capitalise(answers.get(3)));

        int score = currentGame.getScore();
        String scr = String.valueOf(score);
        TextView score1 = (TextView) findViewById(R.id.score);
        score1.setText(scr);
               }


    public void setTimer() {
        final long finishTime = 15;
        // NOTE: use the member, instead of a local
        CountDownTimer counterTimer = new CountDownTimer(finishTime * 1000, 1000) {
            public void onFinish() {
                currentGame.decrementScore();
                setQuestions();
             }

            public void onTick(long millisUntilFinished) {

                TextView time = (TextView) findViewById(R.id.timers);
                time.setText( " "+millisUntilFinished/1000);
                                }
        };
        counterTimer.start();
    }



    @Override
    public void onClick(View arg0) {
        //Log.d("Questions", "Moving to next question");
        if(arg0.getId()==R.id.answer5)
        {
        new AlertDialog.Builder(this)
        .setMessage("Are you sure?")
        .setCancelable(true)
        .setPositiveButton("Yes",
         new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog,
         int id) {
                finish();
                 }
             }).setNegativeButton("No", null).show();

                }

        else
        {
            if(!checkAnswer(arg0)) return;  

        /**
         * check if end of game
         */
        if (currentGame.isGameOver()){
            //Log.d("Questions", "End of game! lets add up the scores..");
            //Log.d("Questions", "Questions Correct: " + currentGame.getRight());
            //Log.d("Questions", "Questions Wrong: " + currentGame.getWrong());
            Intent i = new Intent(this, EndgameActivity.class);
            startActivity(i);
            finish();
        }
        else{
            Intent i = new Intent(this, QuestionActivity.class);
                        finish();
                        startActivity(i);
        }
        }
      }



    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        switch (keyCode)
        {
        case KeyEvent.KEYCODE_BACK :
            return true;
        }

        return super.onKeyDown(keyCode, event);
    }


    /**
     * Check if a checkbox has been selected, and if it
     * has then check if its correct and update gamescore
     */
    private boolean checkAnswer(View v) {

        Button b=(Button) v;
        String answer = b.getText().toString();

            //Log.d("Questions", "Valid Checkbox selection made - check if correct");
            if (currentQ.getAnswer().equalsIgnoreCase(answer))
            {
                b.setBackgroundResource(R.drawable.answercolor);
                //Log.d("Questions", "Correct Answer!");
                currentGame.incrementScore();
            }
            else{
                b.setBackgroundResource(R.drawable.answercolorr);
                //Log.d("Questions", "Incorrect Answer!");
                currentGame.decrementScore();
            }
            return true;
        }

}
¿Fue útil?

Solución

You need to use

 CountDownTimer.cancel();

as soon as you want the timer to stop incrementing or decrementing.

http://developer.android.com/reference/android/os/CountDownTimer.html#cancel%28%29

Also, I would recomment that you make your CountDownTimer a member variable, so that you can cancel it from anywhere:

public class QuestionActivity extends Activity implements OnClickListener {

    private CountDownTimer counterTimer;
    // ...


    public void setTimer() {
        final long finishTime = 15;

        counterTimer = new CountDownTimer(finishTime * 1000, 1000) {
            public void onFinish() {
                currentGame.decrementScore();
                setQuestions();
             }

            public void onTick(long millisUntilFinished) {

                TextView time = (TextView) findViewById(R.id.timers);
                time.setText( " "+millisUntilFinished/1000);
            }
        };
        counterTimer.start();
    }
}

Otros consejos

In method checkAnswer(), timer should be cancelled. Otherwise when timer expires, #onFinish() would be called, causing an extra decrementScore().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top