Android – Ottenga il tempo del widget del cronometro

Come get il tempo da un cronometro? Ho provato getText, getFormat, getBase, ecc, ma nessuno di loro potrebbe funzionare.

Esempio di codice di snippet:

  • Quanto dura per un messaggio da Google Cloud Messaging per arrivare sul dispositivo
  • Imansible eseguire il debug dei campioni NDK con Android Studio 1.3.2 in Windows
  • Come get tutti i video sul dispositivo Android
  • Gestori in Android
  • Come creare una barra di progresso circolare in Android che ruota su di esso?
  • Count di lancio dell'applicazione
  • 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(); 

  • Come convertire automaticamente if-else if statement per passare
  • Creazione di controlli composto con attributi XML personalizzati
  • Barra di scorrimento Android con una vista in più (inclusa lo screenshot)
  • Android - soluzione perfetta per chiudere o terminare un'applicazione in modo programmato?
  • serializzare / deserializzare una java LinkedHashMap (android)
  • Cosa devo sapere per portre il Cyanogenmod a telefoni o tablet non supportti?
  • 7 Solutions collect form web for “Android – Ottenga il tempo del widget del cronometro”

    Se esamini la sorgente della class Cronometro, vedrai che non memorizza il tempo trascorso in un field e lo calcola internamente each volta che ha bisogno di aggiornare il display.

    Tuttavia è relativamente facile fare lo stesso nel proprio codice:

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

    Questo presuppone che tu abbia iniziato il tuo orologio qualcosa di simile:

     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 circa il cronometro è che non si può veramente usarlo come un cronometro che viene avviato, arrestato e riavviato di nuovo. Quando è in esecuzione, mostrerà sempre il tempo trascorso da quando l'hai resettato per l'ultima volta, non import quante volte e per quanto tempo l'hai interrotta nel frattempo . Quando viene arrestato, si interrompe semplicemente l'aggiornamento del display.

    Se hai bisogno di qualcosa di simile a un cronometro, devi compilare il cronometro o forse creare la propria versione utilizzando la sorgente .

    alt text

    Ho trovato questo esempio davvero utile, grazie a nyenyec!

    Ecco i miei due centesimi su come trasformarla in una vera e propria function di cronometro, senza subclassare il cronometro. Basta cambiare il metodo mStartListener per analizzare il text da mChronometer (derivato da TextView dopo tutto), calcolare millisecondi e utilizzare setBase () per regolare il tempo di base in quella quantità di tempo in passato:

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

    @nyenyec +1: ecco quello che ho finito con, utilizzando la risposta di nyenyec senza una class secondaria.

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

    where è THRESHOLD

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

    La 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; 

    Ci sono due pulsanti nel layout che chiamano entrambi il metodo starttimer (start e stop)

    Un po 'tardi risposta, ma oggi stavo cercando di risolvere questo problema. Ho finito solo parsing il text 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 call getSecondsFromDurationString con view.getText (). ToString () ti dà il tempo totale trascorso in secondi (la mia applicazione è una sorta di stop watch, in modo che tu possa metterla in pausa e riprenderla).

    Spero che sia d'aiuto.

      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 arrays[] = chronoText.split(":"); if (arrays.length == 2) { stoppedMilliseconds = Integer.parseInt(arrays[0]) * 60 * 1000 + Integer.parseInt(arrays[1]) * 1000; } else if (arrays.length == 3) { stoppedMilliseconds = Integer.parseInt(arrays[0]) * 60 * 60 * 1000 + Integer.parseInt(arrays[1]) * 60 * 1000 + Integer.parseInt(arrays[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(); } }; } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.