Создать инкрементный таймер в секундах в формате 00:00?

Я хочу создать увеличивающийся второй таймер, например секундомер.

Итак, я хочу иметь возможность отображать секунды и минуты в формате 00:01...

Google выводит только 24-часовые примеры, мне было интересно, может ли кто-нибудь помочь мне начать с примера или руководства о том, что я хочу сделать?

Редактировать:

Вот что у меня есть с помощью хронометра в Android до сих пор

В onCreate()

    secondsT = 0;
    elapsedTimeBeforePause = 0;

    stopWatch.start();
    startTime = SystemClock.elapsedRealtime();
    stopWatch.setBase(elapsedTimeBeforePause);

     stopWatch.setOnChronometerTickListener(new OnChronometerTickListener(){
            @Override
            public void onChronometerTick(Chronometer arg0) {
                //countUp is a long declared earlier
                secondsT = (SystemClock.elapsedRealtime() - arg0.getBase()) / 1000;
                String asText = (secondsT / 60) + ":" + (secondsT % 60); 
                //textGoesHere is a TextView
                ((TextView)findViewById(R.id.time)).setText(asText);
            }
     });

В onDestroy()

@Override
public void onDestroy() {

    inCall = false;
    elapsedTimeBeforePause = SystemClock.elapsedRealtime() - stopWatch.getBase();

    super.onDestroy();
}

Вышеприведенное компилируется и запускается, но TextView никогда не увеличивается, он всегда остается равным 0, может ли кто-нибудь понять, почему?


person Donal Rafferty    schedule 29.03.2010    source источник
comment
Вы хотели бы считать время Unix и отображать в формате 00:00.   -  person Rimian    schedule 29.03.2010
comment
Проблема в таймере или в таймере? И как вы хотите его отображать, Swing, CLI, веб-страницу?   -  person extraneon    schedule 29.03.2010
comment
Создание таймера в минуту - это то, что я хочу научиться делать правильно, целью на самом деле является Android, и таймер должен отображаться в TextView - developer.android.com/intl/de/reference/android/widget/   -  person Donal Rafferty    schedule 29.03.2010


Ответы (2)


Я предполагаю, что вы не знаете об Android Chronometer — в нем уже есть базовая функция секундомера. Вам нужно немного поработать с его особенностями, но нетрудно заставить его делать то, что вы хотите, когда вы понимаете, как он работает.

Есть несколько способов подсчета времени на телефоне, но два основных:

  1. «Реальное время», например, сейчас, согласно моим компьютерным часам, это 11:23 утра в Англии. Однако это может измениться, если мой компьютер свяжется с сервером времени и получит неправильное время, или если я путешествовал с ноутбуком и пересек границу часового пояса. Использование этого может нанести ущерб вашему секундомеру, поскольку измеренное время может измениться в любое время.

  2. «Время, прошедшее с момента загрузки», которое представляет собой количество миллисекунд с момента включения телефона. Это число не имеет никакого отношения к реальному времени, но оно будет вести себя совершенно предсказуемым образом. Это то, что использует Android Chronometer.

Chronometer по сути является таймером обратного отсчета, сравнивающим текущий SystemClock.elapsedRealtime() с elapsedRealtime(), который был установлен для его базового времени. Разница между ними, деленная на 1000, представляет собой количество секунд с момента запуска таймера. Однако, если вы остановите таймер, а затем запустите его снова, вы получите нелогичный результат — таймер покажет прошедшее время, как будто он никогда не останавливался. Это связано с тем, что вам необходимо скорректировать его базовое время, чтобы учесть время, когда оно было остановлено. Это просто сделать:

// When you're stopping the stopwatch, use this
// This is the number of milliseconds the timer was running for
elapsedTimeBeforePause = SystemClock.elapsedRealtime() - timer.getBase();

// When you're starting it again:
timer.setBase(SystemClock.elapsedRealtime() - elapsedTimeBeforePause);

Редактировать: вот полный код базового секундомера, который отображает ваше время в TextView, а не в виджете Chronometer, объявленном в вашем XML-файле.

public class TestProject extends Activity {
    TextView textGoesHere;
    long startTime;
    long countUp;

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

        Chronometer stopWatch = (Chronometer) findViewById(R.id.chrono);
        startTime = SystemClock.elapsedRealtime();

        textGoesHere = (TextView) findViewById(R.id.textGoesHere);
        stopWatch.setOnChronometerTickListener(new OnChronometerTickListener(){
            @Override
            public void onChronometerTick(Chronometer arg0) {
                countUp = (SystemClock.elapsedRealtime() - arg0.getBase()) / 1000;
                String asText = (countUp / 60) + ":" + (countUp % 60); 
                textGoesHere.setText(asText);
            }
        });
        stopWatch.start();
    }
}

В вашем main.xml вам нужно иметь это

<Chronometer android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/chrono"
    android:visibility="gone"/>

Несомненно, есть способ заставить Chronometer работать, не объявляя его в файле XML, но конструктор Chronometer stopwatch = new Chronometer(this); не работал должным образом.

Приведенный выше код отображает прошедшее время очень простым способом. Например, если прошло всего 5 секунд, будет показано 0:5, а не 0:05, которое вы, вероятно, хотите. Исправить это несложно, но я оставлю это на ваше усмотрение! :)

person Steve Haley    schedule 29.03.2010
comment
Отличный пост! Могу я просто спросить, откуда вы берете startTime? - person Donal Rafferty; 29.03.2010
comment
О, startTime просто еще одно длинное значение, установленное в SystemClock.elapsedRealtime() одновременно с запуском хронометра. Это фактически дает ему то же значение, что и базовое время хронометра, поэтому вместо этого вы могли бы использовать arg0.getBase(). - person Steve Haley; 29.03.2010
comment
Я реализовал, как указано выше (см. отредактированный пост), но TextView остается равным 0 и никогда не увеличивается, вы случайно не видите причину этого? - person Donal Rafferty; 29.03.2010
comment
Да, я срезал угол, когда публиковал ответ, потому что он становился слишком длинным. Я отредактирую свой ответ, чтобы предоставить полную проблему. - person Steve Haley; 29.03.2010
comment
Спасибо, теперь я добавил его в xml, я полагаю, мне нужно ссылаться на него в моем коде, что-то вроде секундомера = findResourceById(R.id.Chrono)? - person Donal Rafferty; 29.03.2010
comment
Нет, это весь код. По какой-то магии в setContentView или findViewById(R.id.chrono) он правильно инициализирует хронометр. Запуск этого кода для меня правильно отображает текстовое поле с x: x, правильно увеличивая каждую секунду. - person Steve Haley; 29.03.2010
comment
Ура, спасибо, что разобрались, ваша помощь очень ценится - person Donal Rafferty; 29.03.2010
comment
Спасибо я искал эту информацию - person jramirez; 09.08.2010
comment
спасибо, это очень полезно для меня, как установить такой формат 00:09 . - person RajaReddy PolamReddy; 23.09.2011
comment
Радж: потратьте некоторое время, чтобы понять, что делает приведенный выше код. Как только вы это поймете, вы увидите, что изменить этот формат текста можно очень легко. Просто сделайте оператор if, проверяющий значение countUp / 60 и countUp % 60, добавляя 0 перед строкой, если это необходимо. - person Steve Haley; 23.09.2011
comment
Замечательный пост, предложение, как подойти к сценарию, когда происходит выход из Activity (onDestroy()) и вы возвращаете его (скажем, из Notifications-onResume()). Хронометр будет уничтожен. Я хочу по-прежнему считать время, даже после того, как Activity будет уничтожено. Я сделал 3 решения, но не могу решить, какое лучше. Хронометр в классе службы (который живет) и программно добавляя этот хронометр в макет действия. Обработчик с тиковым сообщением, которое увеличивает счетчик. Последнее - приведенный выше код, но я сохраняю timeOfDestroy и timeOfResume и добавляю diff в базу Chronometer. - person hovanessyan; 13.12.2011
comment
Спасибо! Вместо String asText ...; я использовал это: asText= chrono.getText().toString(); Это также устраняет необходимость в countUp. - person Jon; 21.06.2012
comment
Привет, кто-нибудь может мне помочь. Я хочу сделать этот секундомер глобальным для каждого действия моего приложения? - person Ankit HTech; 23.10.2012
comment
@rajohns Я не смотрел на это более 3 лет: P Я даже не мог сказать, является ли Chronometer лучшим способом сделать это, если он когда-либо был. Вы можете добиться того же результата с самой публикацией Runnable, если хотите получать «галочку» каждую секунду. - person Steve Haley; 12.07.2013
comment
@SteveHaley В итоге я использовал ответ, который я разместил здесь: .com/questions/17598440/ Спасибо, что вернулись и дали мне знать. - person Adam Johns; 12.07.2013
comment
Как вы отображаете это в панели уведомлений, когда приложение переходит в фоновый режим? - person John Ernest Guadalupe; 25.05.2015

Как насчет этих цифровых часов.

Но в основном вы сможете найти множество реализаций Java, погуглив по ключевым словам, таким как java, секундомер, цифровые часы,...

Вы можете взглянуть на апплет секундомера и внести необходимые изменения (упс нет источника с этим)

person jitter    schedule 29.03.2010
comment
К сожалению, извините, не проверил zip-файл. Проверить расширенный ответ - person jitter; 29.03.2010