web-dev-qa-db-fra.com

Android - Obtenez le widget du temps du chronomètre

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

Exemple d'extrait de code:

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();
45
Isaac Waller

Si vous regardez la source de la classe Chronometer, vous verrez qu'elle ne stocke pas le temps écoulé dans un champ et le calcule en interne chaque fois qu'il a besoin de 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 démarré 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 déroutante à propos de Chronometer est que vous ne pouvez pas vraiment l'utiliser comme chronomètre qui démarre, s'arrête et redémarre à nouveau. Lorsqu'il est en cours d'exécution, il affichera toujours le temps écoulé depuis la dernière réinitialisation, , peu importe combien de fois et pendant combien de temps vous l'avez arrêté entre-temps . Lorsqu'il est arrêté, il arrête simplement la mise à jour de l'affichage.

Si vous avez besoin de quelque chose comme un chronomètre, vous devrez sous-classer le chronomètre ou peut-être créer votre propre version en utilisant source .

alt text

100
nyenyec

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

Voici mes deux cents pour savoir comment le transformer en une véritable fonction chronomètre, sans sous-classer le chronomètre. Modifiez simplement la méthode mStartListener pour analyser le texte de mChronometer (il est dérivé de TextView après tout), calculez les millisecondes et utilisez setBase () pour réajuster l'heure de base à cette quantité de temps 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();
    }
  };
12
user158114

@nyenyec +1: voici ce avec quoi j'ai fini, tout en utilisant la réponse de nyenyec sans sous-classe.

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

où SEUIL est

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

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

Dans onCreate:

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

Il y a deux boutons dans la disposition qui appellent tous les deux la méthode starttimer (start et stop)

2
Dominik Benner

Réponse un peu tardive, mais j'essayais de résoudre ce problème moi-même 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);
}

Donc, appeler getSecondsFromDurationString avec view.getText (). ToString () vous donne le temps total écoulé en secondes (mon application est une sorte de chronomètre, vous pouvez donc la suspendre et la reprendre).

J'espère que cela aide.

2
jeudyx
    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
hoofuz
//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();
        }
    };
}
0
Subash Basnet