2014-09-30 57 views
-1

我已经提出了包含5个问题的测验应用程序。我做了一个显示测验结果的ResultActivity页面。在应用程序中添加倒数计时器

现在我想为每个问题添加20秒的countDown计时器。当倒数计时器结束时,它自动转到下一个问题。当问题完成后,它应该移到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{ 
      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) { 
       // TODO Auto-generated method stub 
       Intent intent=new Intent(getApplicationContext(),QuizActivity.class); 
       startActivity(intent); 
       QuizActivity.lhm.clear(); 
       QuizActivity.qid=0; 
      } 
     }); 
    } 



    @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

你尝试过什么?如果您需要为您免费提供的一些代码,则无法在此处使用。 – 2014-09-30 05:30:20

+0

[Android中的倒数计时器](http://www.androidhub4you.com/2014/01/countdown-example-in-android-custom.html) – 2014-09-30 05:30:30

回答

0

,你可以在未来使用这个

预约倒计时,直到时间,定期通知时间间隔。使得前先前回调是永远不会发生一个呼叫到onTick(长)

new CountDownTimer(30000, 1000) { 

public void onTick(long millisUntilFinished) { 
    mTextField.setText("seconds remaining: " + millisUntilFinished/1000); 
} 

    public void onFinish() { 
    mTextField.setText("done!"); 
    } 
}.start(); 

到onTick(长)的调用是同步的,以该目的:示出了在文本字段30秒倒计时的示例完成。这只有在onTick(long)的执行需要一定的时间才能执行,与倒计时间隔相比是显着的时候才有意义。

如需更多帮助link

我希望这是帮助你。

+0

hello..i几乎完成我的app.only两个问题是可以帮助我解决它。1)如果用户没有选择任何选项并且计时器结束,那么通过将错过的问题答案错误地转移到下一个问题。 2)当我点击下一个按钮而没有选择任何选项时,它显示我吐司消息但计时器正在重新启动。我用最近的代码编辑了QuizActivity.java文件.. – vvv12 2014-10-02 07:52:52

0

See CountDown Timer Here

MyCountDownTimer countDownTimer一个全局变量

// Global Variable 
    MyCountDownTimer countDownTimer; 
    boolean isTimerFinished = false; 

    // Oncreate 
    countDownTimer = new MyCountDownTimer(20000 /*20 Sec*/, 1000); 
    countDownTimer.start(); 

    butNext.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (rda.isChecked() || rdb.isChecked() || rdc.isChecked()) { 
       qid++; 
       Log.d("yourans", currentQ.getANSWER() + " " + answer.getText()); 
       grp.clearCheck(); 

       // wronganswers= 
       if (currentQ.getANSWER().equals(answer.getText())) { 
        correct++; 
       } else { 
        lhm.put(currentQ.getQUESTION(), currentQ.getANSWER()); 
        wrong++; 
       } 
       getNext(); 
      }else{ 
       Toast.makeText(getApplicationText(), "Please Select an Option", Toast.LENGTH_LONG).show(); 
      } 
     } 
    }); 




// Counter Class 
@SuppressLint("NewApi") 
public class MyCountDownTimer extends CountDownTimer { 
    public MyCountDownTimer(long startTime, long interval) { 
     super(startTime, interval); 
    } 

    @Override 
    public void onFinish() { 
     Log.e("Times up","Times up"); 

     isTimerFinished = true; 

     getNextQuestion(); 
    } 

    @Override 
    public void onTick(long millisUntilFinished) { 
     Log.e("Second Gone","Another Second Gone"); 
     Log.e("Time Remaining","seconds remaining: " + millisUntilFinished/1000); 
    } 
} 

void getNextQuestion() { 
    nextFlag = true; 
    RadioGroup grp = (RadioGroup) findViewById(R.id.radioGroup1); 
    // grp.clearCheck(); 
    RadioButton answer = (RadioButton) findViewById(grp 
      .getCheckedRadioButtonId()); 

    if (isTimerFinished) { 
     // Checking if some option is selected on time finished 
     someName();   
    } else { 
     // No Option Selected After Time Finished 
     // Write your Logic here About Question Handling on "No OPTION SELECTED After Timer Finished..." My Logic May Be Wrong depends on how you are handling it. 

     lhm.put(currentQ.getQUESTION(), currentQ.getANSWER()); 
     wrong++; 
    } 

    getNext(); 
} 

void someName() { 
    if (rda.isChecked() || rdb.isChecked() || rdc.isChecked()) { 
     qid++; 
     Log.d("yourans", currentQ.getANSWER() + " " + answer.getText()); 
     grp.clearCheck(); 

     if (currentQ.getANSWER().equals(answer.getText())) { 
      correct++; 
     } else { 
      lhm.put(currentQ.getQUESTION(), currentQ.getANSWER()); 
      wrong++; 
     } 
    } 
} 

void getNext() { 
    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); 
    } 
} 

private void setQuestionView() { 
    txtQuestion.setText(currentQ.getQUESTION()); 
    rda.setText(currentQ.getOPTA()); 
    rdb.setText(currentQ.getOPTB()); 
    rdc.setText(currentQ.getOPTC()); 

    // Start The timer again 
    countDownTimer.start(); 

} 
+0

thanx for help.but有一个问题。当应用程序启动时,计时器正在启动,但它没有显示像20 19 18 ... 0那样的计时器。当它在定时器结束后移动到下一个问题时,它不会再从20开始。 – vvv12 2014-09-30 06:14:16

+0

检查我的编辑。并告诉我现在工作正常吗? – 2014-09-30 06:41:11

+0

是的,现在计数器自动启动。但是在完成最后一个问题计时器仍然开始。并且我怎样才能显示20 19 18 .....直到0的流量。 – vvv12 2014-09-30 07:08:34