1

试图在我的应用程序中制作一个小的倒数计时器,但它不起作用。

想法是倒计时到特定的时间。首先是几天,然后是几小时。

以下方法在我的 Fragmentclass.java 中(所以它是一个片段)

@Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onViewCreated(view, savedInstanceState);


        Calendar cal = Calendar.getInstance();
        cal.set(2012, 8, 29, 10, 0);
        long endTime = cal.getTimeInMillis(); 
        long currentTime = System.currentTimeMillis();
        long remaining = currentTime - endTime;                 
        long seconds = remaining / 1000 % 60;               

         new CountDownTimer(seconds, 1000) {
             TextView tv = (TextView)getActivity().findViewById(R.id.introTimeLeft);
             public void onTick(long millisUntilFinished) {

                 Calendar cal = Calendar.getInstance();
                 cal.set(2012, 8, 29, 10, 0);
                long endTime = cal.getTimeInMillis(); 
                long currentTime = System.currentTimeMillis();
                long remaining = currentTime - endTime;                 
                long hours = remaining / 3600000;
                long mins = remaining / 60000 % 60;
                long seconds = remaining / 1000 % 60;
                long days = hours / 24;
                String remainingText = String.valueOf(days) + " days";

                Log.i("countdown",String.valueOf(days));
                 tv.setText("Days left: " + days);
             }

             public void onFinish() {
                 Log.i("countdown","CD Finished");
                 tv.setText("CD Finished!");
             }
          }.start();
    }

请注意,文本框值现在仅用于测试,但我似乎无法让它显示倒计时。

这也是最好的方法吗?

4

1 回答 1

2

如果我运行您的代码,以下是变量的值:

endTime     = 1348902045437
currentTime = 1340645325437
remaining   = -8256720000
seconds     = 0

如您所见seconds == 0,这就是原因。

另请注意,CountDownTimer(long millisInFuture, long countDownInterval) 构造函数中的第一个参数是

从调用 start() 到倒计时完成并调用 onFinish() 的未来毫秒数。

所以一个固定的代码是:

Calendar cal = Calendar.getInstance();
cal.set(2012, 8, 29, 10, 0);
long endTime = cal.getTimeInMillis(); 
long currentTime = System.currentTimeMillis();
long remaining = endTime - currentTime;

new CountDownTimer(remaining, 1000) {
...

更新:

奇怪的是它不更新文本视图。我能提出的唯一想法是在主 UI 线程上运行更新调用。它应该是这样的:

public void onTick(long millisUntilFinished) {
    final String days = .. // some code to generate days
    getActivity().runOnUiThread(new Runnable() {
        public void run() {
            tv.setText("Days left: " + days);
        }
    });
}

public void onFinish() {
    Log.i("countdown","CD Finished");
    getActivity().runOnUiThread(new Runnable() {
        public void run() {
            tv.setText("CD Finished!");
        }
    });
}

如果这没有帮助 - 那么我没有想法。

于 2012-06-25T17:30:30.087 回答