Android: obtén el tiempo del widget del cronómetro

¿Cómo obtener el tiempo de un cronómetro? Intenté getText, getFormat, getBase, etc., pero ninguno de ellos podría funcionar.

Fragmento de código de ejemplo:

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(); 

Si observa la fuente de la clase Chronometer, verá que no almacena el tiempo transcurrido en un campo y lo calcula internamente cada vez que necesita actualizar la pantalla.

Sin embargo, es relativamente fácil hacer lo mismo en su propio código:

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

Esto supone que ha iniciado su reloj de la siguiente manera:

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

Aquí hay un ejemplo completo:

 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(); } }; } 

Una cosa un tanto confusa sobre Chronometer es que realmente no se puede usar como un cronómetro que se inicia, detiene y reinicia de nuevo. Cuando se está ejecutando, siempre mostrará el tiempo transcurrido desde la última vez que lo reinició, sin importar cuántas veces y por cuánto tiempo lo haya detenido mientras tanto . Cuando se detiene, simplemente deja de actualizar la pantalla.

Si necesita algo como un cronómetro, tendrá que crear una subclase de Chronometer o quizás crear su propia versión con la fuente .

texto alternativo

Encontré este ejemplo realmente útil, gracias nyenyec!

Aquí están mis dos centavos sobre cómo convertirlo en una verdadera función de cronómetro, sin subclasificar el cronómetro. Simplemente cambie el método mStartListener para analizar el texto de mChronometer (se deriva de TextView después de todo), calcule milisegundos y use setBase () para reajustar el tiempo base a esa cantidad de tiempo en el pasado:

  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: aquí es con lo que terminé, al usar la respuesta de nyenyec sin una subclase.

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

donde THRESHOLD es

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

Mi solución:

  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(); } } 

En onCreate:

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

Hay dos botones en el diseño que llaman al método starttimer (inicio y parada)

Una respuesta algo tardía, pero intenté resolver esto yo mismo hoy. Terminé analizando el texto de la vista:

  // 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); } 

Entonces, al llamar a getSecondsFromDurationString con view.getText (). ToString () te da el tiempo total transcurrido en segundos (mi aplicación es un tipo de cronómetro, por lo que puedes pausarlo y reanudarlo).

Espero eso ayude.

  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(); } }; }