在应用程序中添加倒数计时器

时间:2014-09-30 05:28:00

标签: java android

我做了一个测验申请,其中包括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;
    }
}

2 个答案:

答案 0 :(得分:0)

你可以用这个

安排倒计时,直到将来的某个时间,并在此过程中定期发送通知。在文本字段中显示30秒倒计时的示例:

 new CountDownTimer(30000, 1000) {

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

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

对onTick(long)的调用将同步到此对象,以便在上一次回调完成之前不会发生对onTick(long)的一次调用。这仅在onTick(long)的执行花费一定时间执行时才相关,这与倒计时间隔相比是显着的。

获取更多帮助link

我希望这对你有所帮助。

答案 1 :(得分: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();

}