2012-11-20 64 views
0

有一個關於CountDownTimer的問題。我必須製作一個應用程序,允許用戶每按一下按鈕,時間就會增加1。然後在按鈕停止點擊後等待三秒鐘,然後開始倒計時。遞增countDownTimer Android

我在下面粘貼了我的代碼。

我的問題是:我似乎無法得到增量的數字工作正常,但似乎停止遞增數字(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); 
} 

我似乎無法弄清楚如何正確增加數字。我嘗試了多種方式,並且一直在搞砸。不知道去哪裏看。任何幫助,將不勝感激。感謝你們!

+1

你在做什麼onStop? – njzk2

+1

如果您想在incrementTime最後一次點擊後等待3秒,您需要一個處理程序和一個sendMessageDelayed以及一個removeMessage – njzk2

+0

對不起,我有onStop開頭。我應該更清楚。我試圖讓它更簡單一些,然後再實施onStop。我只是無法超越實際使時間增量然後減少的部分。您在此處發佈的 – Bob

回答

2

您應該知道,如果倒計時課程中的時間到了,您不必手動撥打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; 
    } 
} 
+0

現在就試試看。謝謝。 – Bob

+0

謝謝!它工作完美。非常感謝! – Bob

1

添加名稱爲TextView的「timerText」在活動的XML文件

添加下列類中的兩個全局變量

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(); 
} 
+0

附加給出錯誤 – AmDroid