2009-02-08 16 views
40

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

código

Ejemplo fragmento:

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

** Cronómetro ** ahora es compatible con 'getText()' – gnB

Respuesta

94

Si nos fijamos en la fuente de la clase cronómetro, verá que no almacena el tiempo transcurrido en un campo y se calcula internamente cada vez que se necesita actualizar la pantalla

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

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

Esto supone que usted ha comenzado su reloj o menos así:

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

Aquí está 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 algo confusa sobre Chronometer es que no se puede usar realmente como un cronómetro que se inicia, se detiene y se 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 durante cuánto tiempo lo haya detenido mientras tanto. Cuando se detiene, simplemente deja de actualizar la pantalla.

Si necesita algo así como un cronómetro, tendrá que subclasificar el cronómetro o quizás crear su propia versión con el source.

alt text

+0

Hola, gracias, pero no puedo hacer que funcione - Siempre obtengo un número (aparentemente) aleatorio entre 1 y 50 cuando lo intento. Gracias, Isaac –

+0

Debería ser algo fácil de arreglar. ¿Puedes publicar un fragmento de código? – nyenyec

+0

Publiqué un fragmento de código, gracias. –

11

me encontré con 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. Sólo cambia el método mStartListener para analizar el texto de mChronometer (se deriva de TextView después de todo), calcular milisegundos, y utilizar SETBASE() para reajustar la base de tiempo a la 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(); 
    } 
    }; 
+0

Gracias por su respuesta. Solía ​​resolver esto: http://stackoverflow.com/questions/2324701/android-chronometer-as-a-persistent-stopwatch-how-to-set-starting-time-what-is/2333564#2333564 – Macarse

3

@ 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 umbral es

private static final int THRESHOLD_EXERSISE = 60000; //In milliseconds 
0
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(); 
      } 
     } 
    }); 
+0

Bienvenido a Stack Overflow! Si bien esto puede responder teóricamente a la pregunta, sería preferible incluir la explicación también. –

2

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; 

El re dos botones en el diseño de la que tanto llama al método startTimer (de inicio y fin)

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

respuesta algo tarde, pero estaba tratando de resolver esto por mí mismo hoy.Acabé analizar 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); 
} 

Así llamando getSecondsFromDurationString con view.getText toString()() le da el tiempo total transcurrido en segundos (mi solicitud es una especie de cronómetro, por lo puedes pausarlo y reanudarlo).

Espero que ayude.

Cuestiones relacionadas