将CountDownTimer转换为我的SimpleDateFormat输出的问题

时间:2012-08-18 22:51:28

标签: java android simpledateformat countdowntimer

我有一个倒计时的计时器。我希望显示的格式为00.00或“ss.SS”。但是我几小时没有取得任何进展。如果没有SimpleDateFormat,它将显示01.91,然后转到01.9。这使得很难观看,因为它使视图保持居中而闪烁。我真正想要的是保持格式01.90并且不允许丢弃0的方法。我可以使用没有SimpleDateFormat的原始代码完成此操作吗?

/*
 *  This is my original code before I tried the SimpleDateFormat
 *
 *  This code is fully functional and works good, it just keeps dropping the 0 every
 *     10 milliseconds and makes the view shake
 *
 *  getTimeSecs() could return 5, 10, 15, 30, 90 seconds converted to milliseconds
 *  getCountDownInterval() returns 10
 *  
 */

public void createTimer() {
    myCounter = new CountDownTimer(getTimeSecs(), getCountDownInterval()) {
        public void onTick(long millisUntilFinished) {
        timerIsRunning = true;

            if(millisUntilFinished < 10000) {
                TVcountDown.setText("0" + ((millisUntilFinished / 10) / 100.0));
            } else {
                TVcountDown.setText("" + ((millisUntilFinished / 10) / 100.0));
            }
        } //end onTick()

        @Override
        public void onFinish() {  
            timerIsRunning = false;
            TVcountDown.setBackgroundColor(myRes.getColor(R.color.solid_red));
            TVcountDown.setTextColor(myRes.getColor(R.color.white));
            TVcountDown.setText("Expired");

            // Make sure vibrate feature is enabled
            if(wantsVib == true) {
            vib.vibrate(300);
            }

        } //end onFinish()

    }.start();

} //end createTimer()

尝试SimpleDateFormat

后,这是我的代码
public void createTimer() {
    myCounter = new CountDownTimer(getTimeSecs(), getCountDownInterval()) {
        public void onTick(long millisUntilFinished) {
        timerIsRunning = true;
            long current = (long) ((millisUntilFinished / 10) / 100.0);
            TVcountDown.setText("" + timerDisplay.format(current));
        }

        @Override
        public void onFinish() {  
            timerIsRunning = false;
            TVcountDown.setBackgroundColor(myRes.getColor(R.color.solid_red));
            TVcountDown.setTextColor(myRes.getColor(R.color.white));
            TVcountDown.setText("Expired");

            // Make sure vibrate feature is enabled
            if(wantsVib == true) {
                vib.vibrate(300);
            }

        }

    }.start();

} //end createTimer()

我知道!我甚至不认为我接近使用SimpleDateFormat并且我感到沮丧。它会运行,但在毫秒数上只倒数秒。所以15秒显示00.15而不是15.00。

我不希望有人为我编写代码,只需要指向正确的方向。我能找到的所有教程都涉及数年,数天等等,而我无法从中掌握这一概念。

我不想使用SimpleDateFormat - 因为它对我来说并不简单 - 只需使用我的原始代码,并在每10毫秒的毫秒边加一个零。

提前致谢。

2 个答案:

答案 0 :(得分:2)

试试这个:

TVcountDown.setText(convertToMyFormat(millisUntilFinished));

convertToMyFormat()方法:

public String convertToMyFormat(long ms) {
    String secString, msecString;
    //constructing the sec format:
    int sec = (int) (ms / 1000);
    if(sec < 10)        secString = "0"+sec;
    else if(sec == 0)   secString = "00";
    else                secString = ""+sec;
    //constructing the msec format:
    int msec = (int) ((ms-(sec*1000))/10.0);
    if(msec < 10)       msecString = "0"+msec;
    else if(msec == 0)  msecString = "00";
    else                msecString = ""+msec;

    return secString+":"+msecString;
}

我不确定我是否正确地执行了msec部分,但您可以根据需要进行调整。

答案 1 :(得分:0)

将数字转换为字符串,它将保持格式化。另外你可以做这样的事情

    public String NumToStr(long i){
    if (i < 10 ) {
        return ("0" + Long.toString(i));
    }
        return Long.toString(i);
    }

确保“9”始终返回“09”。现在将字符串设置为文本。

实际上可能更容易的是

    if(millisUntilFinished < 10000) {
            TVcountDown.setText("0" + Long.toString((millisUntilFinished / 10) / 100.0));
    } else {
            TVcountDown.setText("" + Long.toString((millisUntilFinished / 10) / 100.0));
    }

使用Float.toString()或Double.toString,或任何你需要的。不要害怕编写一个小函数来编辑字符串,以便在需要时使其显示。

  public String KeepFirstTwoCharOfString(String string){
      //code to store first two Char into string
      // return the string containing only first 2 chars
  }