web-dev-qa-db-fra.com

Android: Comment afficher une horloge de mise à jour dans un TextView

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é

16
Richard Rout

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. 

2
Peter Knego

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.

37
Alex

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.

15
Joe Krill

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 "".

3
Sreerag S Kumar

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

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

        }
    });
0
Jitty Aandyan