Android: obtén el widget de hora del cronómetro
¿Cómo sacar la hora de un cronómetro? Probé getText, getFormat, getBase, etc., pero ninguno de ellos funcionó.
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 Cronómetro, 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 tu propio código:
long elapsedMillis = SystemClock.elapsedRealtime() - chronometerInstance.getBase();
Esto supone que ha iniciado su reloj de esta 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 puedes usarlo como un cronómetro que arranca, se detiene y se reinicia nuevamente. Cuando esté funcionando, siempre mostrará el tiempo transcurrido desde la última vez que lo reiniciaste, sin importar cuántas veces y durante cuánto tiempo lo hayas 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 Cronómetro o tal vez crear su propia versión utilizando la fuente .
Este ejemplo me pareció realmente útil, ¡gracias nyenyec!
Aquí está mi granito de arena sobre cómo convertirlo en una función de cronómetro real, sin subclasificar Cronómetro. Simplemente cambie el método mStartListener para analizar el texto de mChronometer (después de todo, se deriva de TextView), 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: esto es con lo que terminé, mientras usaba 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 UMBRAL es
private static final int THRESHOLD_EXERSISE = 60000; //In milliseconds