增加countDownTimer Android

对CountDownTimer有疑问。 我必须创建一个应用程序,允许用户每次单击按钮时将时间时间增加+1。 然后在按钮停止点击后等待三秒钟,然后开始倒计时。

我在下面粘贴了我的代码。

我的问题是:我似乎无法使数字的增量正常工作,但似乎在我停止递增数字(onStop())后它直接进入(onFinish())。 而不是去OnTick()并将数字每秒减少1。 我已经尝试了很多方法来解决这个问题,但一直困扰着。

谁能引导我朝着正确的方向做什么? 任何帮助,将不胜感激。 感谢你们!

public class MainActivity extends Activity { Button incrementTime, startTime; public TextView timedisplay; public myTimer wavetimer; private long millisInFuture; private long millisUntilFinished; private long countDownInterval; private long onclicktime; //private WaveInterface model; public int countdown; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); incrementTime = (Button) findViewById(R.id.button2); startTime = (Button) findViewById(R.id.button3); incrementTime.setText("Increment Time"); startTime.setText("Start"); timedisplay = (TextView) findViewById(R.id.mycounter); timedisplay.setText("Time Left: " + millisUntilFinished); wavetimer = new myTimer (millisInFuture, 1000); incrementTime.setOnClickListener(new OnClickListener(){ int countdown = 01; /** * On click button Listner * @return */ public void onClick(View v) { millisInFuture++; return; } }); startTime.setOnClickListener(new OnClickListener(){ public void onClick(View v) { wavetimer.start(); } });} @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } public class myTimer extends CountDownTimer { public long millisInFuture; private long countDownInterval; public myTimer(long millisInFuture, long countDownInterval) { super(millisInFuture, countDownInterval); } @Override public void onTick(long millisUntilFinished) { millisUntilFinished--; if (millisUntilFinished == 0){ wavetimer.onFinish(); } else { timedisplay.setText("Time Left: " + millisUntilFinished / 1000); } } @Override public void onFinish() { timedisplay.setText("Countdown Finished"); wavetimer.cancel(); } public void onStop() { millisInFuture = millisInFuture + 1; timedisplay.setText("Time Left: " + millisInFuture); } 

我似乎无法弄清楚如何正确增加数字。 我尝试了多种方式,它一直在搞砸。 不知道在哪里看。 任何帮助,将不胜感激。 感谢你们!

您应该知道,在倒计时课程中时间onFinish时您不必手动调用onFinish ,也不需要在onFinish取消,因为一个导致另一个或手动减少任何东西。 尝试以下操作,看看它是否适合您的任务。 希望你能注意到我没有看到一个实用的理由,看看是否“按钮不再被点击”。

 public class MainActivity extends Activity { Button incrementTime, startTime; public TextView timedisplay; long millisInFuture = 1000; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); incrementTime = (Button) findViewById(R.id.button2); startTime = (Button) findViewById(R.id.button3); timedisplay = (TextView) findViewById(R.id.mycounter); resetText(); incrementTime.setOnClickListener(new OnClickListener() { public void onClick(View v) { millisInFuture += 1000; resetText(); } }); startTime.setOnClickListener(new OnClickListener(){ public void onClick(View v) { CountDownTimer wavetimer = new myTimer(millisInFuture + 3000, 1000).start(); // ^ add 3 seconds. } });} protected void resetText() { timedisplay.setText("Time Left: " + millisInFuture / 1000); } public class myTimer extends CountDownTimer { private long millisActual; public myTimer(long millisInFuture, long countDownInterval) { super(millisInFuture, countDownInterval); millisActual = millisInFuture - 3000; } @Override public void onTick(long millisUntilFinished) { //v start showing the tick after 3 seconds. if (millisUntilFinished <= millisActual) { timedisplay.setText("Time Left: " + millisUntilFinished / 1000); } } @Override public void onFinish() { timedisplay.setText("Countdown Finished"); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } } 

在活动xml文件中添加名为“timerText”的TextView

在类中添加以下两个全局变量

 int repeatCounter=1;//incrementing for every 60 sec CountDownTimer tripTimeCounter; 

将以下方法添加到类中并从活动onCreate或您想要的任何其他位置调用它

 public void startTimeCounter(){ tripTimeCounter=new CountDownTimer(60*1000, 1000){ @Override public void onFinish() { // TODO Auto-generated method stub repeatCounter=repeatCounter+1; startTimeCounter();//follow the recursion on finish of the limit of 60 seconds & increment the repeat counter } @Override public void onTick(long millisUntilFinished) { // TODO Auto-generated method stub timerText.setText(formatMillis((repeatCounter*60)*1000-millisUntilFinished)); } }.start(); } 

要以时间格式显示值,请使用以下方法

  static public String formatMillis(long val) { StringBuilder buf=new StringBuilder(20); String sgn=""; if(val<0) { sgn="-"; val=Math.abs(val); } append(buf,sgn,0,( val/3600000)); append(buf,":",2,((val%3600000)/60000)); append(buf,":",2,((val %60000)/1000)); //append(buf,".",3,( val%1000)); return buf.toString(); }