Правильное отображение минут в Android CountDownTimer

У меня есть приложение для Android с таймером. По умолчанию отображается как 00:00:00 (часы, минуты, секунды). Пользователь может нажать HMS и перетащить ползунок по кругу, чтобы изменить час, минуту или секунду, в зависимости от того, какой из них щелкнул. Я пытаюсь создать CountDownTimer, анализируя число из изменяемых TextViews в течение часов, минут и секунд, конвертируя все это в секунды, а затем запуская таймер; однако проблема в том, что отображается общее количество минут, а не 59 и меньше. Например, если я отсчитываю 3 часа. Он отображает 2 часа, 179 минут и 59 секунд. Когда я хочу, чтобы это было 2 часа. 59 минут, 59 секунд.

введите здесь описание изображения

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

Вот мой код для setActionListener для моего CountDownTimer в моем классе, я сделал комментарий, где, по моему мнению, может быть ошибка.:

private void setActionListeners() {

    number_text = (TextView) findViewById(R.id.hour_progress_number);
    minute_text = (TextView) findViewById(R.id.minute_progress_number);
    second_text = (TextView) findViewById(R.id.second_progress_number);




    start_timer.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

           // textViewShowTime.setTextAppearance(getApplicationContext(), R.style.normalText);

            hourint = Integer.valueOf(number_text.getText().toString());

            minuteint = Integer.valueOf(minute_text.getText().toString());

            secondint = Integer.valueOf(second_text.getText().toString());

            Log.i("YourActivity", "Hours: " + hourint);

            Log.i("YourActivity", "Minutes: " + minuteint);

            Log.i("YourActivity", "Seconds: " + secondint);

            totalTimeCountInMilliseconds = ((hourint*60*60) +(minuteint*60) + (secondint)) * 1000;      // time count for 3 minutes = 180 seconds
            timeBlinkInMilliseconds = totalTimeCountInMilliseconds/1000;

            countDownTimer = new CountDownTimer(totalTimeCountInMilliseconds, 500) {
                // 500 means, onTick function will be called at every 500 milliseconds

                @Override
                public void onTick(long leftTimeInMilliseconds) {
                    long seconds = leftTimeInMilliseconds / 1000;
                    mSeekArc.setVisibility(View.INVISIBLE);


                    if ( leftTimeInMilliseconds < timeBlinkInMilliseconds ) {
                       // textViewShowTime.setTextAppearance(getApplicationContext(), R.style.blinkText);
                        // change the style of the textview .. giving a red alert style

                        if ( blink ) {
                            number_text.setVisibility(View.VISIBLE);
                            minute_text.setVisibility(View.VISIBLE);
                            second_text.setVisibility(View.VISIBLE);


                            // if blink is true, textview will be visible
                        } else {
                            number_text.setVisibility(View.INVISIBLE);
                            minute_text.setVisibility(View.INVISIBLE);
                            second_text.setVisibility(View.INVISIBLE);


                        }

                        blink = !blink;         // toggle the value of blink
                    }

                    second_text.setText(String.format("%02d", seconds % 60));  


                    //THE ERROR MIGHT BE HERE FOR THE MINUTE
                    minute_text.setText(String.format("%02d", seconds / 60));


                    number_text.setText(String.format("%02d", seconds / 3600));                     // format the textview to show the easily readable format
                }


                @Override
                public void onFinish() {
                    // this function will be called when the timecount is finished
                    //textViewShowTime.setText("Time up!");
                    number_text.setVisibility(View.VISIBLE);
                    minute_text.setVisibility(View.VISIBLE);
                    second_text.setVisibility(View.VISIBLE);
                    mSeekArc.setVisibility(View.VISIBLE);
                }

            }.start();

        }
    });

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

Вроде все делаю правильно:

Таймер обратного отсчета в формате ЧЧ:ММ:СС в Android

В чем именно проблема и как ее можно исправить?

Вот мой полный код для класса, если это необходимо:

http://pastebin.com/yquQPtG5


person Rohit Tigga    schedule 14.08.2014    source источник


Ответы (3)


 minutes = seconds % 60;

Знак % представляет работу мода в Java, он должен быть таким же в Android.

person Arvy    schedule 14.08.2014
comment
Это дает необработанные секунды, а не минуты. - person PearsonArtPhoto; 15.08.2014

Ваша ошибка, как вы подозревали, здесь.

minute_text.setText(String.format("%02d", seconds / 60));

Вам нужно вычесть количество часов. Вы также можете выполнить операцию по модулю в оставшейся части с вашим форматированием, как показано ниже.

minute_text.setText(String.format("%02d", (seconds / 60) % 60));

Лучшим способом сделать это было бы вычислить значения заранее, а затем просто выполнить форматирование занятых значений.

int just_hours = seconds / 3600;
int just_minutes = (seconds/60) % 60;
int just_seconds = seconds % 60;
person PearsonArtPhoto    schedule 14.08.2014
comment
Простое и удобное решение! Глупый я, я должен был понять это, но спасибо. Вычисление значений заранее намного лучше. - person Rohit Tigga; 15.08.2014

Используйте этот код, чтобы получить правильное количество минут, секунд и часов:

//Count down one Minute
if (secondsLeft > 0) {
    secondsLeft--;
}

// Count down one Minute
else if (secondsLeft == 0 && minutesLeft != 0) {
    secondsLeft = 59;
    minutesLeft--;
}

// Count down one Hour
else if (secondsLeft == 0 && minutesLeft == 0) {
    hoursLeft = 59;
    minutesLeft = 59;
    secondsLeft--;
}

Вам просто нужно инициализировать секунды, минуты и часы, чтобы выбрать значение секунд, минут и часов. countDownTimer должен тикать каждые 1000 мс.

person Gumbo    schedule 14.08.2014
comment
Это включает в себя 3 таймера, что еще больше усложняет ситуацию ... Настройка с одним таймером по своей сути более точна и проще в обслуживании. - person PearsonArtPhoto; 14.08.2014
comment
После того, как я сделал сообщение, я понял, что его можно проще заархивировать по модулю, но это, безусловно, решение. - person Gumbo; 14.08.2014