在android中使用倒计时器显示天数小时分秒的倒计时问题

时间:2012-12-12 06:09:45

标签: android

我在我的应用程序中使用倒数计时器,我需要显示即将到来的日期,以天数小时,分钟和秒为单位。我得到了天,小时,分钟和秒,但是当我将其设置为文本视图时,倒计时无法启动。以下是我的代码。

Date date = new Date(2013,Integer.parseInt(datess.get(k).split("-")[1])-1,Integer.parseInt(datess.get(k).split("-")[0]),hours,mins,secs);  
     long dtMili = System.currentTimeMillis();  
     Date dateNow = new Date(dtMili);  
      remain = date.getTime() - dateNow.getTime();


MyCount counter = new MyCount(remain,1000);
            counter.start();

public class MyCount extends CountDownTimer{
    public MyCount(long millisInFuture, long countDownInterval) {
        super(millisInFuture, countDownInterval);
        }



    @Override
    public void onFinish() {
        // TODO Auto-generated method stub

        tv3.setText("done");
    }

    @Override
    public void onTick(long millisUntilFinished) {
        // TODO Auto-generated method stub


        tv3.setText(timeCalculate(millisUntilFinished/1000) + " Countdown");

    }
}

 public String timeCalculate(long ttime)   
   {  
     long  daysuuu,hoursuuu, minutesuuu, secondsuuu;  
     String daysT = "", restT = "";  



     daysuuu = (Math.round(ttime) / 86400);  
     hoursuuu = (Math.round(ttime) / 3600) - (daysuuu * 24);  
     minutesuuu = (Math.round(ttime) / 60) - (daysuuu * 1440) - (hoursuuu * 60);  
     secondsuuu = Math.round(ttime) % 60;  


     if(daysuuu==1) daysT = String.format("%d day ", daysuuu);  
     if(daysuuu>1) daysT = String.format("%d days ", daysuuu);  

     restT = String.format("%02d:%02d:%02d", hoursuuu, minutesuuu, secondsuuu);  

     return daysT + restT;  
   }  

这是输出

enter image description here

为什么倒计时没有开始?任何建议都表示赞赏。

4 个答案:

答案 0 :(得分:6)

您没有使用millisUntilFinished参数更新timeCalculate()中的时间。从:

开始
@Override
public void onTick(long millisUntilFinished) {
    tv3.setText(millisUntilFinished + " Countdown");
}

一旦确认计时器正在运行,您将需要一种方法将millisUntilFinished转换为人类可读的字符串。

与Java中的日期和时间相关的类不必要地使用并且具有一些模糊的错误。 (例如,大多数Date类都已弃用,但推荐的Calendar类仍然严重依赖于Date ...)第三方库Joda Time是一个受欢迎的替代品。


添加

  

输出不是我预期的

未来25,000至700天不是我所期望的,date似乎是错误的。正如加布里埃尔在another answer中指出的那样,这个年份的价值是从1900年算起的。虽然其他的东西仍然是错的,因为将来25,000天不到70年...... 但是,此构造函数已弃用且不应使用,Calendar是推荐的类。我为你写了quick demo使用日历。

但要明白CountDownTimer本身有几个基本缺陷:

  • 每次调用onTick() CDT都会在整个时间内增加几毫秒,我注意到它每天可以轻松添加7分半钟。
  • 由于第一个错误,可能无法调用最后一个onTick()。从5开始倒数时,我通常会看到"5, 4, 3, 2, <long pause>",然后onFinished()会显示"0" ...

我在上一个问题中重写了CDT:android CountDownTimer - additional milliseconds delay between ticks

答案 1 :(得分:2)

您的问题是您没有正确使用Date()。

java.util.Date.Date(int year,int month,int day,int hour,int minute,int second)的参数在第一个参数中使用0表示1900年。

你编写的代码计算了将近2000年的日期,然后减去当前时间,这使得倒计时很长; - )。

如果将一行更改为

,应用程序应该可以正常工作
Date date = new Date(2013-1900,Integer.parseInt(datess.get(k).split("-")[1])-1,Integer.parseInt(datess.get(k).split("-")[0]),hours,mins,secs);  

答案 2 :(得分:1)

亲爱的使用Chronometer

int seconds;

    chronometer.setOnChronometerTickListener(new OnChronometerTickListener() 
                    {   
                        public void onChronometerTick(Chronometer chronometer) 
                        {
                            seconds = (int) ((SystemClock.elapsedRealtime() - chronometer.getBase()) / 1000);
                            String strTime = (seconds / 60) + ":" + (seconds % 60);
                            lblTime.setText(strTime);
                        }
                    });
                    chronometer.setBase(SystemClock.elapsedRealtime());
                    chronometer.start

之后尝试工作。 并根据需要获得日期和时间。

答案 3 :(得分:0)

试试此代码

CountDownTimer countDown = new CountDownTimer(3000,1000) {

        @Override
        public void onTick(long millisUntilFinished) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onFinish() {
            // TODO Auto-generated method stub

        }
    };
    countDown.start();