29 votes

Android - Obtenez le widget chronomètre

J'ai un widget Chronomètre dans mon application Android. Je me demandais comment en tirer le temps. J'ai essayé getText, getFormat, getBase, etc., mais aucun ne fonctionne. C'est probablement une question facile, mais je ne l'ai pas trouvée sur Google.
Merci, Isaac Waller

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

72voto

nyenyec Points 2487

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

Cependant, il est relativement facile de faire la même chose 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();
    }
};
}

Un peu déroutant chose à propos de Chronomètre, c'est que vous ne pouvez pas vraiment l'utiliser comme un chronomètre se met en marche, l'arrêt et le redémarrage de nouveau. Quand il est en cours d'exécution, il sera toujours montrer le temps écoulé depuis la dernière réinitialisation, peu importe combien de fois et pendant combien de temps vous avez arrêté dans le temps. Quand il est arrêté, il s'arrête tout simplement la mise à jour de l'affichage.

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

alt text

2voto

Dominik Benner Points 21

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)

1voto

jeudyx Points 21

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[1]);
    }

    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.

0voto

Samuel Points 4472

@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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X