倒数计时器问题

时间:2010-09-11 22:25:12

标签: android timer countdown

我正在使用倒数计时器并将其设置为可以由用户设置。当计时器到达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();} 

        };

}

1 个答案:

答案 0 :(得分:0)

切断初始化代码会让我感到困惑,因为它太长时间没有注意到你的大括号没有平衡......

看起来你正在创建你的计数器并在两个onclick函数之外初始化它。在这个阶段,长度为零。

当您单击开始按钮时,长度设置为有效时间,但计时器未重新初始化,因此它以先前设置的零值开始,并立即触发onFinish。

按暂停时,会计算正确的剩余时间,然后将其传递到您在恢复时创建的新计数器,然后继续正常倒计时。

counter = new MyCount(length, 100);之后直接移动dialog.show();}应确保在单击设置计时器按钮时初始化计数器并解决问题。