Android – Получить время виджета хронометра

Как получить время с хронометра? Я попробовал getText, getFormat, getBase и т. Д., Но никто из них не мог работать.

Пример фрагмента кода:

Chronometer t = (Chronometer)findViewById(R.id.toptime); long time = SystemClock.elapsedRealtime()-t.getBase(); Log.d(null,"Was: "+time); //time is not the proper time for some reason - it is a random number between 0 and 50 t.setBase(SystemClock.elapsedRealtime()); t.start(); 

Solutions Collecting From Web of "Android – Получить время виджета хронометра"

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

Однако относительно легко сделать то же самое в своем собственном коде:

 long elapsedMillis = SystemClock.elapsedRealtime() - chronometerInstance.getBase(); 

Это предполагает, что вы начали свои часы примерно так:

 chronometerInstance.setBase(SystemClock.elapsedRealtime()); chronometerInstance.start(); 

Вот полный пример:

 public class ChronoExample extends Activity { Chronometer mChronometer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); mChronometer = new Chronometer(this); layout.addView(mChronometer); Button startButton = new Button(this); startButton.setText("Start"); startButton.setOnClickListener(mStartListener); layout.addView(startButton); Button stopButton = new Button(this); stopButton.setText("Stop"); stopButton.setOnClickListener(mStopListener); layout.addView(stopButton); Button resetButton = new Button(this); resetButton.setText("Reset"); resetButton.setOnClickListener(mResetListener); layout.addView(resetButton); setContentView(layout); } private void showElapsedTime() { long elapsedMillis = SystemClock.elapsedRealtime() - mChronometer.getBase(); Toast.makeText(ChronoExample.this, "Elapsed milliseconds: " + elapsedMillis, Toast.LENGTH_SHORT).show(); } View.OnClickListener mStartListener = new OnClickListener() { public void onClick(View v) { mChronometer.start(); showElapsedTime(); } }; View.OnClickListener mStopListener = new OnClickListener() { public void onClick(View v) { mChronometer.stop(); showElapsedTime(); } }; View.OnClickListener mResetListener = new OnClickListener() { public void onClick(View v) { mChronometer.setBase(SystemClock.elapsedRealtime()); showElapsedTime(); } }; } 

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

Если вам нужно что-то вроде секундомера, вам придется подклассировать хронометр или, возможно, создать свою собственную версию с использованием источника .

Alt text

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

Вот мои два цента о том, как превратить его в настоящую функцию секундомера без подкласса Chronometer. Просто измените метод mStartListener на синтаксический анализ текста из mChronometer (он все-таки получен из TextView), рассчитайте миллисекунды и используйте setBase () для перенастройки базового времени на такое количество времени в прошлом:

  View.OnClickListener mStartListener = new OnClickListener() { public void onClick(View v) { int stoppedMilliseconds = 0; String chronoText = mChronometer.getText().toString(); String array[] = chronoText.split(":"); if (array.length == 2) { stoppedMilliseconds = Integer.parseInt(array[0]) * 60 * 1000 + Integer.parseInt(array[1]) * 1000; } else if (array.length == 3) { stoppedMilliseconds = Integer.parseInt(array[0]) * 60 * 60 * 1000 + Integer.parseInt(array[1]) * 60 * 1000 + Integer.parseInt(array[2]) * 1000; } mChronometer.setBase(SystemClock.elapsedRealtime() - stoppedMilliseconds); mChronometer.start(); } }; 

@nyenyec +1: вот что я закончил с использованием ответа nyenyec без подкласса.

  chronometer.setOnChronometerTickListener(new OnChronometerTickListener() { @Override public void onChronometerTick(Chronometer chronometer) { long elapsedMillis = SystemClock.elapsedRealtime() - chronometer.getBase(); if(elapsedMillis>THRESHOLD){ doYourStuff(); } } }); 

Где ПОРОГ

 private static final int THRESHOLD_EXERSISE = 60000; //In milliseconds 

Мое решение:

  public void starttimer(View view){ Button mybtn = (Button) view; if (mybtn.equals(findViewById(R.id.button1))) { mycm.setBase(SystemClock.elapsedRealtime() - elapsed); mycm.start(); } else { mycm.stop(); elapsed = SystemClock.elapsedRealtime() - mycm.getBase(); } } 

В onCreate:

  mycm = (Chronometer) findViewById(R.id.chronometer1); elapsed = 0; 

В макете есть две кнопки, которые вызывают метод starttimer (запуск и останов)

Несколько поздний ответ, но я пытался решить это сам сегодня. Я просто разобрал текст взгляда:

  // Expects a string in the form MM:SS or HH:MM:SS public static int getSecondsFromDurationString(String value){ String [] parts = value.split(":"); // Wrong format, no value for you. if(parts.length < 2 || parts.length > 3) return 0; int seconds = 0, minutes = 0, hours = 0; if(parts.length == 2){ seconds = Integer.parseInt(parts[1]); minutes = Integer.parseInt(parts[0]); } else if(parts.length == 3){ seconds = Integer.parseInt(parts[2]); minutes = Integer.parseInt(parts[1]); hours = Integer.parseInt(parts[0]); } return seconds + (minutes*60) + (hours*3600); } 

Таким образом, вызов getSecondsFromDurationString с помощью view.getText (). ToString () дает вам общее время в секундах (мое приложение – это какой-то секундомер, поэтому вы можете приостановить его и возобновить).

Надеюсь, поможет.

  final Chronometer counter = (Chronometer) findViewById(R.id.chronometer1); counter.setOnChronometerTickListener(new OnChronometerTickListener() { public void onChronometerTick(Chronometer chronometer) { // TODO Auto-generated method stub chronometer.refreshDrawableState(); } }); final ToggleButton togglebutton = (ToggleButton) findViewById(R.id.togglebutton1); togglebutton.setOnClickListener(new OnClickListener() { public void onClick(View v) { // Perform action on clicks if (togglebutton.isChecked()) { counter.start(); } else { counter.stop(); } } }); 
 //ok here is the final changed code which works well import android.app.Activity; import android.os.Bundle; import android.os.SystemClock; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Chronometer; import android.widget.LinearLayout; import android.widget.Toast; public class HelloWidgetActivity extends Activity { Chronometer mChronometer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); mChronometer = new Chronometer(this); layout.addView(mChronometer); Button startButton = new Button(this); startButton.setText("Start"); startButton.setOnClickListener(mStartListener); layout.addView(startButton); Button stopButton = new Button(this); stopButton.setText("Stop"); stopButton.setOnClickListener(mStopListener); layout.addView(stopButton); Button resetButton = new Button(this); resetButton.setText("Reset"); resetButton.setOnClickListener(mResetListener); layout.addView(resetButton); setContentView(layout); } private void showElapsedTime() { long elapsedMillis = SystemClock.elapsedRealtime() - mChronometer.getBase(); Toast.makeText(HelloWidgetActivity.this, "Elapsed milliseconds: " + elapsedMillis, Toast.LENGTH_SHORT).show(); } View.OnClickListener mStartListener = new OnClickListener() { public void onClick(View v) { int stoppedMilliseconds = 0; String chronoText = mChronometer.getText().toString(); String array[] = chronoText.split(":"); if (array.length == 2) { stoppedMilliseconds = Integer.parseInt(array[0]) * 60 * 1000 + Integer.parseInt(array[1]) * 1000; } else if (array.length == 3) { stoppedMilliseconds = Integer.parseInt(array[0]) * 60 * 60 * 1000 + Integer.parseInt(array[1]) * 60 * 1000 + Integer.parseInt(array[2]) * 1000; } mChronometer.setBase(SystemClock.elapsedRealtime() - stoppedMilliseconds); mChronometer.start(); } }; View.OnClickListener mStopListener = new OnClickListener() { public void onClick(View v) { mChronometer.stop(); showElapsedTime(); } }; View.OnClickListener mResetListener = new OnClickListener() { public void onClick(View v) { mChronometer.setBase(SystemClock.elapsedRealtime()); mChronometer.stop(); showElapsedTime(); } }; }