avoir une horloge que je veux afficher dans un TextView.
J'aurais pensé qu'il y avait quelques fonctions de Nice pour faire cela, mais je n'ai rien trouvé… .. J'ai fini par implémenter ma propre méthode utilisant un gestionnaire. Ce que je demande cependant, existe-t-il un meilleur moyen (plus efficace) d’afficher une horloge de mise à jour en temps réel?
private Runnable mUpdateClockTask = new Runnable() {
public void run() {
setTime();
mClockHandler.postDelayed(this, 1000);
}
};
C'est mon gestionnaire, qui s'exécute toutes les secondes, puis ma fonction d'heure et de date est inférieure à
TextView mClockView;
public void setTime() {
Calendar cal = Calendar.getInstance();
int minutes = cal.get(Calendar.MINUTE);
if (DateFormat.is24HourFormat(this)) {
int hours = cal.get(Calendar.HOUR_OF_DAY);
mClockView.setText((hours < 10 ? "0" + hours : hours) + ":" + (minutes < 10 ? "0" + minutes : minutes));
}
else {
int hours = cal.get(Calendar.HOUR);
mClockView.setText(hours + ":" + (minutes < 10 ? "0" + minutes : minutes) + " " + new DateFormatSymbols().getAmPmStrings()[cal.get(Calendar.AM_PM)]);
}
}
À votre santé
Rappelez-vous: l'optimisation prématurée est la racine de tous les maux. Donc, n'optimisez que lorsque vous êtes sûr (= l'avez mesuré) que votre implémentation est lente/inefficace.
Cela dit, une méthode plus efficace consisterait probablement à enregistrer l'heure de début via System.currentTimeMillis()
, à la vérifier périodiquement et à calculer la différence en minutes.
Mettre à jour l'horloge système n'est pas comme mettre à jour un chronomètre. Nous parlons de l'heure changée à la minute (horloge système minutes et 00 secondes).
Utiliser une minuterie n’est pas la bonne façon de procéder. Ce n'est pas seulement exagéré, mais vous devez recourir à quelques astuces pour y arriver.
La bonne façon de faire cela (c’est-à-dire mettre à jour un TextView affichant l’heure sous la forme HH: mm) consiste à utiliser BroadcastReceiver comme ceci:
BroadcastReceiver _broadcastReceiver;
private final SimpleDateFormat _sdfWatchTime = new SimpleDateFormat("HH:mm");
private TextView _tvTime;
@Override
public void onStart() {
super.onStart();
_broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context ctx, Intent intent) {
if (intent.getAction().compareTo(Intent.ACTION_TIME_TICK) == 0)
_tvTime.setText(_sdfWatchTime.format(new Date()));
}
};
registerReceiver(_broadcastReceiver, new IntentFilter(Intent.ACTION_TIME_TICK));
}
@Override
public void onStop() {
super.onStop();
if (_broadcastReceiver != null)
unregisterReceiver(_broadcastReceiver);
}
Le système enverra cet événement de diffusion au début exact de chaque minute, en fonction de l'horloge système. N'oubliez cependant pas d'initialiser votre TextView à l'avance (à l'heure actuelle du système), car il est probable que vous afficherez votre interface utilisateur au milieu d'une minute et que TextView ne sera pas mis à jour jusqu'à la prochaine minute.
Consultez les classes Chronometer et DigitalClock , qui sont des extensions de la classe TextView. Ils devraient automatiquement faire ce que vous cherchez. Si vous avez besoin de fonctionnalités supplémentaires, examinez simplement le code source correspondant et apportez les modifications nécessaires.
METTRE À JOUR:
Puisque l’horloge numérique est obsolète dans l’API 17, il est recommandé d’utiliser Text Clock à la place.
Je recommande TextClock (à partir de l'API 17), veuillez également ne pas utiliser DigitalClock (obsolète à partir de l'API 17) car cela provoquerait MEMORY LEAK et entraînerait une exception de mémoire insuffisante . Ajoutez le code suivant au fichier layout.xml correspondant fichier
<TextClock
Android:id="@+id/textClock1"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:gravity="center_horizontal"
Android:textColor="#17d409" />
Cela fera l'affaire. Veuillez également noter que vous pouvez formater l'heure d'affichage comme requis, par exemple pour passer au format 12 heures avec secondes, vous pouvez utiliser "Android: format12Hour =" hh: mm: ss a "".
Vous pouvez utiliser le widget TextClock fourni par Android
<TextClock
Android:id="@+id/textClock"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:format12Hour="hh:mm:ss a"
Android:gravity="center_horizontal"
Android:textColor="#d41709"
Android:textSize="20sp"
Android:textStyle="bold" />
il nécessite un niveau minimum de 17 API
https://developer.Android.com/reference/Android/widget/TextClock
si vous voulez l'heure actuelle dans une autre vue de texte
vous pouvez utiliser l'extrait de code ci-dessous
tClock = (TextClock) findViewById(R.id.textClock1);
tView = (TextView) findViewById(R.id.textview1);
btn = (Button)findViewById(R.id.btnGet);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tView.setText("Time: "+tClock.getText());
}
});
}
Le widget DigitalClock est disponible sous Android api 1 ou utilisez le widget TextClock sous api 17
créer une mise en page pour l'horloge comme ceci en premier:
<LinearLayout
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:orientation="vertical"
>
<TextView Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:gravity="center"
Android:id="@+id/clocktext"
Android:textStyle="bold"
Android:textColor="#ffffff"
Android:layout_marginTop="30dp"
Android:textSize="50sp"
Android:text="2:46"/>
<DigitalClock Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:gravity="center"
Android:id="@+id/clock"
Android:textStyle="bold"
Android:textSize="50sp"
Android:visibility="gone"
Android:textColor="#ffffff"
/>
</LinearLayout>
dans Activity, ajoutez textchage listener au DigitalClock, c'est une sous-classe de textview. Nous pouvons donc ajouter textchangedkistener pour obtenir l'heure mise à jour et régler l'heure de votre textview à votre guise
chagre = (TextView) mTopView.findViewById(R.id.clocktext);// TextView to display Time
clock = (DigitalClock) mTopView.findViewById(R.id.clock);// DigitalClock With visibility=gone
clock.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {}
@Override
public void afterTextChanged(Editable s) {
chagre.setText(s.toString());//will be called when system clock updataes
}
});