2012-11-20 7 views
0

에는 CountDownTimer에 대한 질문이 있습니다. 사용자가 버튼을 클릭 할 때마다 +1을하여 시간을 늘릴 수있는 응용 프로그램을 만들어야합니다. 그런 다음 버튼을 클릭 한 후 3 초 동안 기다린 다음 카운트 다운을 시작합니다.카운트 다운 타이머 초기화 안드로이드

아래 코드를 붙여 넣었습니다.

내 문제가 있습니다 : 내가 제대로 작동 수의 증가를 얻을 수없는 것, 그러나 내가 수를 증가 중지 후 (이동 중지())가 직접가는 것 같습니다 (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); 
} 

숫자를 올바르게 늘리는 방법을 생각할 수 없습니다. 나는 여러 가지 방법을 시도해 왔고 계속 엉망이되었습니다. 봐야할지 모르겠다. 어떤 도움을 주시면 감사하겠습니다. 고마워요! 당신은 시간이 카운트 다운 클래스에 때 수동으로 onFinish를 호출 할 필요가 없습니다 것을 알지, 어느 쪽도 아니 당신이 하나가 다른 리드 또는 수동으로 아무것도 감소 당신이 onFinish에 취소해야해야

+1

다음 시간 형식 사용의 값을 표시하려면? – njzk2

+1

incrementTime을 마지막으로 클릭 한 후 3 초를 기다리려면 핸들러와 sendMessageDelayed 및 removeMessage가 필요합니다. – njzk2

+0

죄송합니다. 시작하려면 onStop을 사용했습니다. 나는 더 분명해야했다. 좀 더 간단하게 만들고, 나중에 onStop을 구현하려고합니다. 나는 실제로 시간 증가분을 감소시킨 다음에 감소시키는 부분을 지나갈 수 없다. – Bob

답변

2

. 다음을 시도해보고 마음에 들었던 작업에 적합한 지 확인하십시오. 버튼이 "더 이상 클릭되지 않는지"를 알 수있는 실용적인 이유가 없다는 것을 알기를 바랍니다.

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

활동 XML 파일에 이름이있는 텍스트 뷰 'timerText'를 추가

클래스에서 두 개의 전역 변수 다음 추가

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

append giving error – AmDroid