Android – Obtenir l'heure du widget chronomètre

Comment obtenir le temps d'un chronomètre? J'ai essayé getText, getFormat, getBase, etc., mais aucun d'eux ne pouvait fonctionner.

Exemple d'extrait de code:

  • Android désactive l'espace uniquement pour Edittext
  • Keytool génère une empreinte SHA1 au lieu de MD5?
  • Dans quelle situation nous voulons ajouter un fragment sans conteneur?
  • Dialogue de progrès de conception de matériaux
  • Une application Android peut-elle se connecter directement à une base de données mysql en ligne
  • Java.lang.SecurityException essayant de lire à partir de l'URI des contacts Android
  • 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(); 

  • Android Push Notification (GCM), existe-t-il une limite quotidienne?
  • Est-il possible d'avoir plus d'un fichier de ressources de chaîne dans Android?
  • Comment faire une boîte de dialogue d'alerte avec un spinner
  • OnCheckedChanged a appelé automatiquement
  • Comment utiliser la caméra Android en arrière-plan?
  • Lecteur RFID pour périphériques mobiles
  • 7 Solutions collect form web for “Android – Obtenir l'heure du widget chronomètre”

    Si vous regardez la source de la classe Chronometer, vous verrez qu'il ne stocke pas le temps écoulé dans un champ et qu'il le calcule en interne chaque fois qu'il doit mettre à jour l'affichage.

    Cependant, il est relativement facile de faire de même dans votre propre code:

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

    Cela suppose que vous avez commencé votre horloge quelque chose comme ceci:

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

    Voici un exemple complet:

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

    Une chose quelque peu confuse à propos de Chronomètre est que vous ne pouvez pas vraiment l'utiliser comme un chronomètre qui démarre, s'arrête et redémarre. Lorsqu'il fonctionne, il montrera toujours le temps écoulé depuis votre dernière réinitialisation, peu importe combien de fois et pour combien de temps vous l'avez-vous arrêté pendant ce temps-là . Lorsqu'il est arrêté, il ne cesse de mettre à jour l'affichage.

    Si vous avez besoin de quelque chose comme un chronomètre, vous devrez sous-classer Chronomètre ou créer votre propre version à l'aide de la source .

    Texte alt

    J'ai trouvé cet exemple vraiment utile, merci nyenyec!

    Voici mes deux cents sur la façon de l'transformer en une véritable fonction de chronomètre, sans sous-classer Chronomètre. Il suffit de modifier la méthode mStartListener pour analyser le texte à partir de mChronometer (c'est dérivé de TextView après tout), calculer des millisecondes et utiliser setBase () pour réajuster le temps de base à ce moment dans le passé:

      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: voici ce que j'ai fini, tout en utilisant la réponse de nyenyec sans sub classe.

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

    Où THRESHOLD est

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

    Ma solution:

      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 existe deux boutons dans la disposition qui appellent la méthode starttimer (start and stop)

    Une réponse assez tardive, mais j'essayais de le résoudre aujourd'hui. J'ai fini par analyser le texte de la vue:

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

    Alors, appelez getSecondsFromDurationString avec view.getText (). ToString () vous donne le temps total écoulé en secondes (mon application est une sorte de chronomètre, afin de pouvoir l'arrêter et le reprendre).

    J'espère que cela aide.

      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 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(); } }; } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.