2009-02-08 12 views
40

Come ottenere il tempo da un cronometro? Ho provato getText, getFormat, getBase, ecc, ma nessuno di loro poteva funzionare.Android - Ottieni il tempo del widget cronometro

codice

Esempio frammento:

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

** Cronometro ** ora supporta 'getText()' – gnB

risposta

94

Se si guarda alla fonte della classe cronometro, vedrai che non memorizza il tempo trascorso in un campo e calcola internamente ogni volta che ha bisogno di aggiornare il display.

Tuttavia è relativamente facile da fare lo stesso nel proprio codice:

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

questo presuppone che hai iniziato il tuo qualcosa di orologio come questo:

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

Ecco un esempio 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 po 'confusa su Chronometer è che non si può davvero usarlo come un cronometro che viene avviato, fermato e riavviato di nuovo. Quando è in esecuzione, mostra sempre il tempo trascorso dall'ultima reimpostazione, , non importa quante volte e per quanto tempo lo hai interrotto nel frattempo. Quando viene fermato, interrompe semplicemente l'aggiornamento del display.

Se hai bisogno di qualcosa come un cronometro dovrai sottoclassi Chronometer o forse creare la tua versione usando lo source.

alt text

+0

Ciao, grazie, ma non riesco a farlo funzionare - ottengo sempre un numero (apparentemente) casuale compreso tra 1 e 50 quando proverò. Grazie, Isaac –

+0

Dovrebbe essere una cosa facile da risolvere. Puoi pubblicare uno snippet di codice? – nyenyec

+0

Ho pubblicato uno snippet di codice: grazie. –

11

Ho trovato questo esempio molto utile, grazie nyenyec!

Ecco i miei due centesimi su come trasformarlo in una funzione di cronometro reale, senza sottoclassi di cronometro. Basta cambiare il metodo di mStartListener di analizzare il testo da mChronometer (è derivato da TextView dopo tutto), calcolare millisecondi, e utilizzare setBase() per regolare il tempo di base a quella quantità di tempo nel passato:

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

Grazie per la tua risposta. Ho usato per risolvere questo: http://stackoverflow.com/questions/2324701/android-chronometer-as-a-persistent-stopwatch-how-to-set-starting-time-what-is/2333564#2333564 – Macarse

3

@ nyenyec +1: ecco cosa ho trovato, mentre usavo la risposta di nyenyec senza una sottoclasse.

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

cui soglia è

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

Benvenuto in Stack Overflow! Mentre questo può teoricamente rispondere alla domanda, sarebbe preferibile includere anche la spiegazione. –

2

mia soluzione:

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

In onCreate:

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

Il re sono due pulsanti del layout, che sia chiamare il metodo startTimer (avvio e arresto)

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

Un po 'in ritardo di risposta, ma stavo cercando di risolvere questo me stesso di oggi.Ho finito appena l'analisi del testo della 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); 
} 

Quindi chiamando getSecondsFromDurationString con view.getText() toString() ti dà il tempo totale trascorso in secondi (la mia domanda è una sorta di cronometro, in modo puoi metterlo in pausa e riprenderlo).

Spero che aiuti.