Таймер обратного отсчета, который имеет параметр увеличения / уменьшения, который может быть установлен пользователем

Я новичок в языке Java, но раньше работал с языком C. Я пробовал много способов решить следующую проблему, но не смог, поэтому мне нужна помощь. Я пытаюсь сделать следующее:

• Установите 5-минутный таймер (счетчик) по умолчанию, чтобы он запускался при нажатии кнопки Start_button.

• Если кнопка Start_button не нажата, а пользователь нажимает кнопку Up_button / Down_button, то параметры таймера отображаются на экране; 5, 10 и 15 минут, и если пользователь нажимает кнопку Starts_button, он начинает обратный отсчет выбранного таймера.

• Пока таймер работает;

  •If Up_button /Down_button is pressed once then reset timer and show previous time setting i.e. 5, 10 or 15minutes.
  •If Up_button /Down_button is pressed again then display timer options on screen and if the user presses Starts_button it starts the timer chosen.  

В данный момент; таймер срабатывает после нажатия кнопки Старт, он отсчитывает 5 минут. Но я не знаю, как лучше всего отобразить параметры таймера, а также запустить выбранный таймер.

Ваша помощь очень ценится, заранее большое спасибо.

Как уже упоминалось выше; Я изучаю программирование на Java, так что расслабьтесь ;-) и покажите мне код, который, по вашему мнению, лучше всего подходит для этой проблемы, пожалуйста

Вот что я сделал до сих пор:

public class Test extends Activity {

// Display Counter Variables
public static Button Up, Down, Green;

TextView timeDisplay;
MyCount counter, counter1, counter2;
int state = 0;
int length = 300000; //5minutes
int length1 = 600000; //10minutes
int length2 = 900000; //15minutes
long startTime = 0;
long currentTime = 0;
long timeElapsed = 0;
long timeRemaining = 0;
long prevTimeRemaining = 0;
boolean up_pressed = false;
boolean down_pressed = false;
private boolean timerStarted=false;

Button start;

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

        seconds = seconds % 60;
        minutes = minutes % 60;

        String secondsD = String.valueOf(seconds);
        String minutesD = String.valueOf(minutes);

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

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


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);


    timeDisplay = (TextView) findViewById(R.id.timer);
    counter = new MyCount (length, 1000);
    counter1 = new MyCount (length1, 1000);
    counter2 = new MyCount (length2, 1000);

    start = (Button) findViewById(R.id.Button);
    Up = (Button)findViewById(R.id.Yellow);
    Down = (Button)findViewById(R.id.Blue);



start.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        switch (state) {
        case 0:
          startTime = System.currentTimeMillis();
            counter.start();
            timerStarted=true;
            start.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));
          start.setText(R.string.resume);
          prevTimeRemaining = timeRemaining;

          // resume
          counter = new MyCount(timeRemaining, 1000);
          state = 0;
          break;

        case 2:
          prevTimeRemaining = 0;
          timerStarted=false;
          counter = new MyCount(length, 1000);
          start.setText(R.string.start);
          timeDisplay.setText(R.string.timer);
          state = 0;
        }
    }
});


    Up.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            down_pressed=true;

            if(up_pressed=true && timerStarted==true 
                || timerStarted==false){
                //Display timer (increment i.e. show 5min --> 10min ..> 15min)

                //start timer chosen by user
            }

        }
    });


    Down.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            down_pressed=true;
            if(down_pressed=true && timerStarted==true 
                || timerStarted==false){
                //Display timer (decrement i.e. show 15min --> 10min ..> 5min)

                //start timer chosen by user
            }
        }
    });
}


  public class MyCount extends CountDownTimer {

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

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

      public void onTick (long millisUntilFinished) {
        timeDisplay.setText ("Left: "  + formatTime(millisUntilFinished));

      }

    }

}


person M-Y    schedule 15.12.2011    source источник


Ответы (1)


Не думаю, что для этого нужен новый класс.

Я бы просто создал глобальную переменную, например.

private CountDownTimer myCount;

Я бы рекомендовал поместить это в такой метод, как

private void setTimer(long countdownMs, long tickMs) {
  CountDownTimer myCount = new CountDownTimer(countdownMs,tickMs) {
  /// TODO
  }.start();
}

Если вам нужно перезапустить таймер, вы можете позвонить

myCount.cancel()
setTimer(...);

Прокомментируйте, если вам нужны подробности :)

person Force    schedule 15.12.2011
comment
Большое спасибо за быстрый ответ. Я добавил код и сказал, что если кнопка Up_button нажата, setTimer (10,0) как в течение десяти минут, но каким-то образом он смешивает его с предыдущим таймером. - person M-Y; 15.12.2011
comment
не забывайте, время в этом примере указывается в миллисекундах, а не в минутах! Как именно он перепутал предыдущий таймер? - person Force; 15.12.2011
comment
Верно, это в миллисекундах. Ну, когда я нажимаю кнопку Up_button во время работы таймера по умолчанию, он ничего не делает с отображаемым временем (и я хочу, чтобы он сбрасывался + показывал мне время, на которое оно было установлено), только когда я нажимаю кнопку паузы, он сбрасывает его и воспроизводит новый таймер сразу .. Если я снова нажму паузу, пока новый таймер работает, оба таймера, т.е. по умолчанию и новый таймер смешиваются, и он пытается отобразить оба, поэтому он испорчен - person M-Y; 15.12.2011
comment
Можете ли вы опубликовать свой полный код на pastebin.com? Тогда было бы легче найти проблему. - person Force; 16.12.2011
comment
Привет Форс, извиняюсь за поздний ответ. Я был далеко от ПК до сих пор .. Я разместил полный код на pastebin.com и назвал его Таймер обратного отсчета, который имеет опцию увеличения / уменьшения - person M-Y; 16.12.2011
comment
Я посмотрел ваш код, но не вижу, что он хранится как глобальная переменная? Это похоже на код, опубликованный выше. Пожалуйста, включите ссылку на сообщение pastebin. - person Force; 16.12.2011
comment
Прошу прощения, я добавил измененный код на pastebin.com по ссылке pastebin.com/gcTj2h74. Вы увидите, что он переходит к новому счетчику, только когда мы приостанавливаем текущий счетчик и нажимаем «Вверх», но не обновляется, когда нажимаем кнопку «Вверх» во время работы счетчика. Я должен сказать: спасибо, что нашли время посмотреть на мой код. - person M-Y; 17.12.2011
comment
почему-то ссылка не работает, поэтому я поместил код в Dropbox по следующей ссылке db.tt/AmjQaVXN - person M-Y; 17.12.2011
comment
Попробуйте без Class MyCount и просто создайте обычный CountDownTimer. Может это сработает - person Force; 17.12.2011
comment
@ Force Мне удалось решить проблему с помощью операторов if и else .. Я просто хочу сказать спасибо за попытку помочь :-) - person M-Y; 20.12.2011
comment
Пожалуйста! Если вы считаете, что этот ответ помог вам решить вашу проблему, отметьте вопрос как решенный. :) - person Force; 20.12.2011