【问题标题】:How to store countdown timer value in a variable?如何将倒数计时器值存储在变量中?
【发布时间】:2013-04-25 08:53:29
【问题描述】:

所以,我的活动中有一个倒计时。现在,我有一个按钮可以打开另一个活动。单击该按钮时,我需要存储当前的倒计时计时器值,并从该保存的值开始在第二个活动中的倒计时计时器。我正在考虑使用 Intent 来打发时间,但我不知道要传递什么价值。我怎样才能做到这一点?我的计时器:

public String formatTime(long millis) {  
        String output = "00:00";  
        long seconds = millis / 1000;  
        long minutes = seconds / 60;  

        seconds = seconds % 60;  
        minutes = minutes % 60;  

        String sec = String.valueOf(seconds);  
        String min = String.valueOf(minutes);  

        if (seconds < 10)  
            sec = "0" + seconds;  
        if (minutes < 10)  
            min= "0" + minutes;  

        output = min + " : " + sec;  
        return output;
    }

在 onCreate 方法中:

// New timer for 40 minutes, starts after initialization
        new MyCount(2400000, 1000) 
        {
            // Updates the text on your "scoreboard" every second
            public void onTick(long millisUntilFinished) 
            {
                vreme.setText("" + formatTime(millisUntilFinished));
            }

            public void onFinish() 
            {

            }
        }.start();
    }

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

         public void onFinish() {


         }
         public void onTick(long millisUntilFinished) {
             vreme.setText("" + millisUntilFinished / 1000);
         }

【问题讨论】:

  • 为什么不能在Intent 中将millisUntilFinished 作为额外的传递?
  • 也许只是intent.putExtra(String,String)?在onReceive()intent.getStringExtra(String)
  • 什么字符串? MillisUntilFinished 不是 Long 吗?
  • @Simon 那么,当我通过 millisUntilFinished 时,我的活动结束时会得到什么值?假设还剩 550 秒……我会得到 550 秒吗?我不完全理解它是如何工作的。
  • 不,它是毫秒,所以你会得到 550000 毫秒。

标签: java android


【解决方案1】:

您要查找的信息似乎无法从 CountDownTimer 获得。如果您不需要非常精确的时间,那么您可以将字符串从 vreme 中拉出。

假设您想要比这更精确,我建议在计时器启动时保存一个时间戳,然后在您需要知道已经过去了多少时间时获取该时间戳与当前时间之间的差异。根据您的需要查看uptimeMillis()elapsedRealtime()

【讨论】:

  • 不,几秒钟没有发生。我有一个用户需要完成游戏的 20 分钟窗口。所以,我不认为几秒钟会那么糟糕。
  • 然后你可以使用 vreme.getText().toString() 来拉出你的计时器字符串。不过,您必须进行一些解析才能从中获取时间。或者,您可以在 onTick 方法中添加一些内容,该方法将存储最新的 millisUntilFinished,然后您可以将其传递给意图。
  • 好的,我做到了,但是如何从字符串(我得到 19:42 之类的东西)解析为 long?
【解决方案2】:

好的,回答我自己。这就是我所做的。在我的第一个活动中,我完成了原始帖子中的所有内容,并在 MyCount 方法中添加了这个,就在 vreme.setText....下方:

currentTime = millisUntilFinished;

之前我在我的活动范围内声明:

long currentTime;

之后,在我的按钮 onClickListener 上,我这样做了:

Intent i = new Intent(Game1.this, Game2.class);
                i.putExtra("timeCode", currentTime);
                startActivity(i);

之后在我的 Game2 类的 onCreate 方法中(也声明了 long 变量):

Bundle extras = getIntent().getExtras(); 
        if(extras !=null) {
           currentTime = extras.getLong("timeCode");
        }

然后这个(它与 Game1 类中的代码基本相同,只有一个变化,我传递的变量而不是 240000 值):

new MyCount(currentTime, 1000) 
    {
        // Updates the text on your "scoreboard" every second
        public void onTick(long millisUntilFinished) 
        {
            vreme.setText("" + formatTime(millisUntilFinished));
        }

        public void onFinish() 
        {

        }
    }.start();
}




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

     public void onFinish() {


     }
     public void onTick(long millisUntilFinished) {
         vreme.setText("" + millisUntilFinished / 1000);
     }

它就像一个魅力!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多