2009-02-08 11 views
40

Wie bekomme ich die Zeit von einem Chronometer? Ich habe getText, getFormat, getBase usw. versucht, aber keiner von ihnen konnte funktionieren.Android - Get Zeit des Chronometer-Widget

Beispiel Code-Schnipsel:

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

** Chronometer ** unterstützt jetzt 'getText()' – gnB

Antwort

94

Wenn Sie an der Quelle der Klasse chronometer anschauen, werden Sie sehen, dass es nicht die in einem Feld verstrichene Zeit speichert und berechnet sie intern es jedes Mal, muss das Display aktualisieren.

Allerdings ist es relativ einfach, das gleiche in Ihrem eigenen Code zu tun:

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

Dies setzt voraus, dass Sie Ihre Uhr so ​​etwas wie diese begonnen haben:

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

Hier ist ein vollständiges Beispiel:

Eine etwas verwirrende Sache über Chronometer ist, dass Sie es nicht wirklich verwenden können als Stoppuhr, die gestartet, gestoppt und erneut gestartet wird. Wenn es läuft, zeigt es immer die verstrichene Zeit an, seit Sie es zuletzt zurückgesetzt haben, egal wie oft und wie lange Sie es in der Zwischenzeit gestoppt haben. Wenn es gestoppt wird, hört es einfach auf, die Anzeige zu aktualisieren.

Wenn Sie etwas wie eine Stoppuhr benötigen, müssen Sie Chronometer Unterklasse oder vielleicht erstellen Sie Ihre eigene Version mit der source.

alt text

+0

Hallo, danke, aber ich kann es nicht zur Arbeit bringen - ich bekomme immer eine (scheinbar) zufällige Zahl zwischen 1 und 50 über, wenn ich es versuche. Danke, Isaac –

+0

Es sollte eine einfache Sache zu beheben sein. Können Sie ein Code-Snippet posten? – nyenyec

+0

Ich habe ein Code-Snippet geposted - danke. –

11

ich dieses Beispiel sehr nützlich gefunden, dank nyenyec!

Hier sind meine zwei Cent, wie man es in eine echte Stoppuhr-Funktion verwandelt, ohne Chronometer zu unterklassifizieren. zu ändern, nur die mStartListener Methode den Text aus mChronometer parsen (es von Textview Schließlich abgeleitet wird), berechnen Millisekunden, und verwendet setBase(), um die Grundzeit auf die Menge an Zeit in der Vergangenheit neu zu justieren:

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

Danke für deine Antwort. Ich habe verwendet, um dies zu lösen: http://stackoverflow.com/questions/2324701/android-chronometer-as-a-persistent-stopwatch-how-to-set-starting-time-what-is/2333564#2333564 – Macarse

3

@ Nyenyec +1: Hier ist, was ich mit endete, während nyenyecs Antwort ohne eine Unterklasse verwendet.

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

wo THRESHOLD ist

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

Willkommen bei Stack Overflow! Während dies theoretisch die Frage beantworten könnte, wäre es vorzuziehen, die Erklärung ebenfalls mit aufzunehmen. –

2

Meine Lösung:

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; 

Die re sind zwei Schaltflächen in dem Layout, das die Methode starttimer beide nennen (Start und Stopp)

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

Etwas späte Antwort, aber ich habe versucht, das selbst heute zu lösen.Ich landete nur den Text der Ansicht Parsen.

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

So getSecondsFromDurationString mit view.getText() aufrufen toString() gibt Ihnen die gesamte verstrichene Zeit in Sekunden (meine Anwendung eine Art Stoppuhr ist, so Sie können es anhalten und fortsetzen).

Ich hoffe, es hilft.