2014-10-06 4 views
0

Я сделал приложение для викторины, которое включает в себя 5 вопросов. Я сделал страницу ResultActivity, которая отображает результат викторины. Я добавил таймер countDown по 20 секунд для каждого вопроса. Когда таймер обратного отсчета заканчивается, он автоматически переходит к следующему вопросу. Когда вопросы будут завершены, он должен перейти на страницу ResultActivity, чтобы отобразить результат.Android CountDown Timer in Quiz Application

У меня есть только одна проблема ... Afetr, достигнув моего последнего вопроса .. если я не выбираю никакого ответа, и таймер закончен, аппликация не переходит на мою страницу ResultActivity. Таймер начинает работу снова и снова на тот же вопрос, пока я не выбрать любой вариант

Вот мой код:

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; 
    } 
} 

ответ

0

Это потому, что Ваше возвращение ложное утверждение никогда не будет достигнута, если пользователь сделал п o выбор:

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

В этом случае if else вы вернете false позже. Но если ни один не выбран, вы автоматически вернете значение true, потому что блок кода внутри этого вышеприведенного оператора не будет прослушиваться. А затем в таймере Вы говорите:

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

getNextQuestion всегда находится верно, если пользователь не имеет никакого выбора, поэтому таймер начинает снова и снова.

+0

так что будет для этого решением? может помочь мне решить его ... :( – vvv12

+0

Я попробую. Каково ваше намерение вернуть ценность? И каково ваше намерение для givin логического параметра? – Opiatefuchs

+0

может дать альтернативное решение .. что может Я использую вместо boolean ... – vvv12