2010-09-11 113 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