Je viens vous solliciter pour un petit coup de pouce. Je viens de programmer un chronomètre en Java sous Android studio et mon chronomètre marche bien mais j'ai juste un petit soucis:
Quand j'appuie sur start mon chronomètre se lance bien, mais si je réappuie une nouvelle fois sur start, mon chronomètre sur remet à 0 et redémarre, j'ai bien essayé de modifié mon code avec des if mais sans succès, donc je viens vers vous tous pour un petit coup de pouce.
case R.id.btn_start: Chrono.setBase(SystemClock.elapsedRealtime()+time); Chrono.start(); break; case R.id.btn_pause: time = Chrono.getBase() - SystemClock.elapsedRealtime(); Chrono.stop(); break; case R.id.btn_reset: time = 0; Chrono.setBase(SystemClock.elapsedRealtime()); Chrono.stop(); break;
Étant donné que l'API Android n'offre aucun moyen de savoir si un chronomètre est démarré ou pas, tu pourrais stocker son état par toi-même dans un booléen. Quand l'utilisateur appuie sur le bouton tu vérifies s'il n'est pas déjà lancé, et si ce n'est pas le cas tu le lances et tu passes ta variable à true. N'oublies pas de la remettre à false quand tu l'arrêtes
⚙️ Une solution simple règle le problème ; une solution compliquée en crée un nouveau.
Étant donné que l'API Android n'offre aucun moyen de savoir si un chronomètre est démarré ou pas, tu pourrais stocker son état par toi-même dans un booléen. Quand l'utilisateur appuie sur le bouton tu vérifies s'il n'est pas déjà lancé, et si ce n'est pas le cas tu le lances et tu passes ta variable à true. N'oublies pas de la remettre à false quand tu l'arrêtes
Je te remercie beaucoup, je vais tenté un bout de programme avec un booléen et je vous tiendrais au courant si j'y suis arrivé.
Bonjour, pour commencer je pense que tu aurais plutôt dû poster dans la catégorie "mobile".
Ensuite plusieurs erreurs dans ton code:
Dans ton if tu as mis "=" au lieu de "==", ce n'est pas du tout la même chose.
Ensuite lorsque l'on rappuit sur start quand running vaut true, il faut que fasse setBase(SystemClock.elapsedRealtime() - time)
Enfin dans ton pause time = tempsActuel-tempsDepart donc l'inverse de ce que tu as fait.
Merci beaucoup pour ton aide, je n'avais pas fait attention que dans mon if je n'avais qu'un seul "=" au lieu de "==". Sa fait tout juste 2 semaines que j'ai commencé la programmation et je fais des erreurs de débutant. Merci encore pour ton aide.
J'ai hésité à mettre mon post dans la catégorie "mobile", car même si c'est une application mobile, elle est codée en Java, donc c'est vrai que j'ai hésité et je ne savais pas quoi faire. Si un modérateur passe par là peut-il déplacer mon post. Merci
Par contre je n'ai pas compris lorsque tu m'as dit:
"Ensuite lorsque l'on rappuit sur start quand running vaut true, il faut que fasse setBase(SystemClock.elapsedRealtime()-time)
Enfin dans ton pause time = tempsActuel-tempsDepart donc l'inverse de ce que tu as fait."
Car pour moi dans mon programme lors du clic sur Pause il se passe:
- 1) la variable running vaut true
-2) time = temps actuel - temps de départ (qui vaut 0 à l'origine)
-3) le chrono s'arrête
Ensuite si je réappuie sur Start:
-1) Comme la variable vaut true je rentre dans mon if
-2) Je remets le chrono à 0 en lui ajoutant le temps qu'il a calculé lorsqu'il était en pause
-3) Le chrono démarre
Et ce programme marche bien. Sauf si j'appuie une deuxième fois sur start, le chrono repartira sur la valeur calculé dans le cas ou j'ai appuyé sur pause. Peut-être faut-il que je remette un else if dans le bouton start non?
Ok en fait vu que tu as inverser à deux endrois ça s'annule et du coup le programme fonctionne! Je m'explique en fait tu donne une valeur négative à time:
time = Chrono.getBase() - SystemClock.elapsedRealtime();
Ici tu es d'accord que le temps actuel (elapsedRealtime) est supérieur au temps de lancement du chrono (getBase). Donc tu stocke une valeur < 0 à time. Je suppose que tu voulais plutôt faire l'inverse! Pour t'en rendre compte tu peut faire ça :
time = Chrono.getBase() - SystemClock.elapsedRealtime();
//à remplacer par
// time = SystemClock.elapsedRealtime() - Chrono.getBase();
Log.i(this.toString(),"time="+time);
Mais tu t'es aussi tromper au moment où tu veut rajouter du temps avant le start(): pour que le chrono commence au temps t tu dois faire :
Chrono.setBase(SystemClock.elapsedRealtime()-t);
//le chrono a commencé il y a t milisecondes
Et pas:
Chrono.setBase(SystemClock.elapsedRealtime()+t);
//le chrono a commencé dans t milisecondes ???
Mais comme tu avais pris l'opposé de time (donc -time, voir plus haut) tu avais en fait:
elapsedRealtime + (-time)
Ce qui équivaut à:
elapsedRealtime -time
Donc au final les erreurs s'annulent et ça marche
Sinon concernant les nom de tes variables Chrono, PauseChrono... Il ne faut pas qu'il commence par une majuscule afin de pouvoir faire la différence entre l'appel d'une méthode statique comme SystemClock.elapsedRealtime() et l'appel d'une méthode d'une instance commme chrono.setBase() avec chrono qui commence par une minuscule.
Enfin juste un conseil, la plupart des IDE propose une fonction permettant de mettre en forme le code, c'est très utile pour rendre le code plus lisible. Généralement cette fonction se trouve dans le menu source/format.
Merci beaucoup d'avoir pris le temps de me répondre et de m'aider dans mon problème.
Sa m'a permis d'approfondir mes connaissance (maigres soient-elles) et de comprendre un peu mieux le logiciel et le language java. C'était un premier exercice que je m'étais donné et je suis content d'avoir réussi. Merci encore à toi.
Juste j'ai deux dernières questions:
1/ Peut-on initialiser le chronomètre?
2/ Peut-on changer le format du chronomètre pour avoir HH:MM:SS:Millisecondes?
2/ Non car comme tu le voit lorsque l'on fait seconds = now - mBase; on a un résultat en ms mais comme le chronomètre fait ensuite seconds/=1000; (ce qui revient à faire seconds=seconds/1000) on n'a plus qu'un résultat en seconde et c'est ce résultat qui sera utilisé pour l'affichage. De plus le chronomètre ne se met à jour que tout les 1000ms:
sendMessageDelayed(Message.obtain(this, TICK_WHAT), 1000);
//veut dire: "tu me rappelle dans 1000ms"
Par contre comme cette classe est open-source (devine d'où viennent les codes que je vient de te montrer) tu peut soit essayer de modifier toi-même la classe, soit de chercher une classe déjà remodifier sur le net.
Merci beaucoup pour tes réponses, je pensais à initialiser mon chronomètre à 0 car au premier lancement il ne démarre pas à 0 mais lorsque je recopie une deuxième fois tout rentre dans l'ordre et c'est pour cela que je pensais peut-être à initialiser mon chronomètre.
j'ai réussi à résoudre mon problème. J'ai enlevé ma variable booléenne et mis deux autres variable de type long à la place et tout marche nickel. Merci à tous de m'avoir aidé. Vous pouvez passer le sujet comme résolu. Merci
Les chutes servent à mieux se relever
Petit soucis
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Ctrl+space
Ctrl+space
Ctrl+space