2010-09-11 116 views
0

我正在使用倒數計時器,並將其設置爲可以由用戶設置。當計時器到達00:00時它應該說「完成!」。出於某種原因,我得到了「完成!」在我啓動計時器之後。點擊暫停並恢復後,顯示我的櫃檯倒計時,但我不確定客戶會因此而變得很酷。任何人都可以告訴我爲什麼會遇到這個問題?謝謝。倒數計時器問題

 package score.keeper.basketball; 

import android.app.Activity; 
import android.app.Dialog; 
import android.os.Bundle; 
import android.os.CountDownTimer; 
import android.view.View; 
import android.view.View.OnLongClickListener; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Spinner; 
import android.widget.TextView; 
import android.widget.AdapterView.OnItemSelectedListener; 

public class Score extends Activity implements AdapterView.OnItemSelectedListener { 

    private Button Button01; 
    private Button Button02; 
    private Button Button03; 
    private Button Button04; 
    private TextView TextView01; 
    private TextView TextView02; 
    private TextView TextView03; 
    private TextView TextView06; 
    private Spinner Spinner01; 
    private Spinner Spinner02; 

    private TextView Team01; 
    private TextView Team02; 

    TextView timeDisplay; 
    int state = 0; 
    int length; 
    long startTime = 0; 
    long currentTime = 0; 
    long timeElapsed = 0; 
    long timeRemaining = 0; 
    long prevTimeRemaining = 0; 
    Button control; 
    MyCount counter; 

    String[] goal={"Three", "Foul", "Two"}; 


    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 


     Button01 = (Button) findViewById(R.id.Button01); 
     Button02 = (Button) findViewById(R.id.Button02); 
     Button03 = (Button) findViewById(R.id.Button03); 
     Button04 = (Button) findViewById(R.id.Button04); 

     TextView01 = (TextView) findViewById(R.id.TextView01); 
     TextView02 = (TextView) findViewById(R.id.TextView02); 
     TextView03 = (TextView) findViewById(R.id.TextView03); 
     TextView06 = (TextView) findViewById(R.id.TextView06); 
     Team01 = (TextView) findViewById(R.id.TextView04); 
     Team02 = (TextView) findViewById(R.id.TextView05); 

     Team01.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

        final Dialog dialog = new Dialog(Score.this); 
        dialog.setContentView(R.layout.setteamname); 
        dialog.setTitle("Team Name"); 
        dialog.setCancelable(true); 

        final EditText teamName = (EditText) dialog.findViewById(R.id.teamName); 

        Button btn = (Button) dialog.findViewById(R.id.setText); 
        btn.setOnClickListener(new View.OnClickListener() { 

         @Override 
         public void onClick(View v) { 

          String teamName2 = teamName.getText().toString(); 

          Team01.setText("" + teamName2); 

          dialog.dismiss(); 
            } 
         });  
        dialog.show(); 
      }}); 

     Team02.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       final Dialog dialog = new Dialog(Score.this); 
       dialog.setContentView(R.layout.setteamname); 
       dialog.setTitle("Team Name"); 
       dialog.setCancelable(true); 

       final EditText teamName = (EditText) dialog.findViewById(R.id.teamName); 

       Button btn = (Button) dialog.findViewById(R.id.setText); 
       btn.setOnClickListener(new View.OnClickListener() { 

        @Override 
        public void onClick(View v) { 

         String teamName3 = teamName.getText().toString(); 

         Team02.setText("" + teamName3); 

         dialog.dismiss(); 
           } 
        });  
       dialog.show(); 
     }}); 

     Spinner spin = (Spinner) findViewById(R.id.Spinner01); 
     spin.setOnItemSelectedListener((OnItemSelectedListener) this); 

     ArrayAdapter<String> aa=new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, goal); 

     aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     spin.setAdapter(aa); 


     Button01.setOnLongClickListener(subtractLeft); 
     Button02.setOnClickListener(new Button.OnClickListener() {public void onClick(View v){my_func1();}}); 
     Button03.setOnLongClickListener(subtractRight); 
     Button04.setOnClickListener(new Button.OnClickListener() {public void onClick(View v){my_func2();}}); 

     timeDisplay = (TextView) findViewById(R.id.timer); 

     timeDisplay.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       final Dialog dialog = new Dialog(Score.this); 
       dialog.setContentView(R.layout.custom_dialog); 
       dialog.setTitle("Set Time"); 
       dialog.setCancelable(true); 

       final EditText min = (EditText) dialog.findViewById(R.id.min); 

       final EditText sec = (EditText) dialog.findViewById(R.id.sec); 

       Button btn = (Button)dialog.findViewById(R.id.positive); 
       btn.setOnClickListener(new View.OnClickListener() { 

        @Override 
        public void onClick(View v){ 

         int min2 = Integer.parseInt(min.getText().toString()); 
         int sec2 = Integer.parseInt(sec.getText().toString()); 

         {length = (((min2 * 60) + sec2) * 1000); 

         dialog.dismiss();} 

        }}); 


       dialog.show();} 

       }); 
     counter = new MyCount(length, 100); 
     control = (Button) findViewById(R.id.control); 

     } 

     public void control(View view) { 
     switch (state) { 
     case 0: 
      startTime = System.currentTimeMillis(); 
      counter.start(); 
      control.setText(R.string.pause); 
      state = 1; 
      break; 
     case 1: 
      // pause 
      currentTime = System.currentTimeMillis(); 
      timeElapsed = currentTime - startTime; 

      if (prevTimeRemaining == 0) 
      timeRemaining = length - timeElapsed; 
      else 
      timeRemaining = prevTimeRemaining - timeElapsed; 
      counter.cancel(); 
      timeDisplay.setText(formatTime(timeRemaining)); 
      control.setText(R.string.resume); 
      prevTimeRemaining = timeRemaining; 

      // resume 
      counter = new MyCount(timeRemaining, 100); 
      state = 0; 
      break; 
     case 2: 
      prevTimeRemaining = 0; 
      counter = new MyCount(length, 100); 
      control.setText(R.string.start); 
      timeDisplay.setText(R.string.timer); 
      state = 0; 
     } 
     } 

     public class MyCount extends CountDownTimer { 

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

     public void onFinish() { 
      timeDisplay.setText("done!"); 
      state = 2; 
      control.setText(R.string.restart); 
     } 

     public void onTick(long millisUntilFinished) { 
      timeDisplay.setText(formatTime(millisUntilFinished)); 
     } 
     } 




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

      seconds = seconds % 60; 
      minutes = minutes % 60; 
      // hours = hours % 60; 

      String secondsD = String.valueOf(seconds); 
      String minutesD = String.valueOf(minutes); 
      // String hoursD = String.valueOf(hours); 

      if (seconds < 10) 
      secondsD = "0" + seconds; 
      if (minutes < 10) 
      minutesD = "0" + minutes; 
      // if (hours < 10) 
      // hoursD = "0" + hours; 

      output = minutesD + " : " + secondsD; 
      return output; 
     } 



    public void setSpinner02(Spinner spinner02) { 
     Spinner02 = spinner02; 
    } 

    public Spinner getSpinner02() { 
     return Spinner02; 
    } 

    public void setSpinner01(Spinner spinner01) { 
     Spinner01 = spinner01; 
    } 

    public Spinner getSpinner01() { 
     return Spinner01; 
    } 

    public void onItemSelected(AdapterView<?> parent, View v, int position, long id) 
    { 
    if ("Three".equals(goal[position])) 
    {TextView03.setText("3");} 

    if ("Foul".equals(goal[position])) 
    {TextView03.setText("1");} 

    if ("Two".equals(goal[position])) 
    {TextView03.setText("2");} 

    } 

    public void onNothingSelected(AdapterView<?> arg0) { 
     // TODO Auto-generated method stub 
     TextView03.setText("2"); 
     TextView06.setText("2"); 

    } 


    void my_func1() { 
     int scoreLeft; 
     int addOne; 
     int scoreLeftTotal; 

     addOne = Integer.parseInt(TextView03.getText().toString()); 
     scoreLeft = Integer.parseInt(TextView01.getText().toString()); 

     scoreLeftTotal = (scoreLeft + addOne); 

     TextView01.setText("" + scoreLeftTotal); 
     } 


    void my_func2() { 
      int scoreRight = Integer.parseInt(TextView02.getText().toString()); 
      int addOne = Integer.parseInt(TextView03.getText().toString()); 

      {int scoreRightTotal = (scoreRight + addOne); 

      TextView02.setText("" + scoreRightTotal); 
      } 

    } 
    private OnLongClickListener subtractLeft = new OnLongClickListener() { 
     public boolean onLongClick(View v) { 
     int scoreLeft = Integer.parseInt(TextView01.getText().toString()); 
     int addOne = Integer.parseInt(TextView03.getText().toString()); 

     {int scoreLeftTotal = (scoreLeft - addOne); 

     TextView01.setText("" + scoreLeftTotal); 
     } 

     return true; 
     } 
}; 
private OnLongClickListener subtractRight = new OnLongClickListener() { 
    public boolean onLongClick(View v) { 
    int scoreRight = Integer.parseInt(TextView02.getText().toString()); 
    int addOne = Integer.parseInt(TextView03.getText().toString()); 

    {int scoreLeftTotal = (scoreRight - addOne); 

    TextView02.setText("" + scoreLeftTotal); 
    } 

    return true; 
    } 
}; 

public void OnClick(View view) { 
    if (view==Team01){ 
     Dialog dialog = new Dialog(Score.this); 
     dialog.setContentView(R.layout.setteamname); 
     dialog.setTitle("Team Name"); 
     dialog.setCancelable(true); 

     final EditText teamName = (EditText) dialog.findViewById(R.id.teamName); 

     teamName.setText(R.id.TextView04); 

     Button btn = (Button)dialog.findViewById(R.id.setText); 
     btn.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       teamName.getText().toString(); 

       Team01.setText("" + teamName); 

       } 

      }); 

     dialog.show();} 

     }; 

} 
+0

這是太多的代碼和一個模糊的問題 - 你真的需要通過調試來縮小導致問題的部分。 – 2010-09-11 22:29:58

回答

0

斬去初始化代碼混淆我在那裏,因爲它太一會兒注意到你的括號不均衡......

它看起來像你創建計數器和初始化它既的外onclick功能。在這個階段長度爲零。

當您單擊開始按鈕時,長度被設置爲有效時間,但計時器不會重新初始化,因此它以先前設置的零值開始並立即啓動。

當您按暫停時,計算正確的剩餘時間,然後將其傳遞到您在恢復時創建的新計數器,然後繼續正常倒計時。

counter = new MyCount(length, 100);直接移動到dialog.show();}之後應該確保在單擊設置的定時器按鈕時計數器被初始化並解決問題。

+0

我已經添加了整個代碼,如果有幫助。我嘗試了你所說的,但它仍然在做。我不知道爲什麼現在這樣做,因爲早些時候它沒有這樣做。儘管如果可能的話,我會把時間設定爲固定的時間間隔,但這會造成差異。 – 2010-09-11 23:28:37

+0

你是否在Time set onClick處理程序中移動了counter = new ...或者如上所示?它必須位於處理程序內(即在Dialog.show();和右括號「}」之間),否則它不會被初始化。 – FixerMark 2010-09-11 23:55:42

+0

好的。我想我明白了。你肯定有正確的想法。它看起來像把它放在dialog.dismiss()之後;作品。所以它的dialog.dismiss(); \t \t \t \t counter = new MyCount(length,100);} – 2010-09-12 00:07:35