web-dev-qa-db-fra.com

Mettre à jour TextView toutes les secondes

J'ai regardé autour de moi et rien ne semble fonctionner de ce que j'ai essayé jusqu'à présent ...

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.deskclock);

    TextView tvTime = (TextView) findViewById(R.id.tvTime);
    TextView tvDate = (TextView) findViewById(R.id.tvDate);

    Java.util.Date noteTS = Calendar.getInstance().getTime();

    String time = "hh:mm"; // 12:00
    tvTime.setText(DateFormat.format(time, noteTS));

    String date = "dd MMMMM yyyy"; // 01 January 2013
    tvDate.setText(DateFormat.format(date, noteTS));

Je souhaite fondamentalement que les méthodes setText soient mises à jour ou actualisées toutes les secondes environ, afin que mon horloge fonctionne réellement comme il se doit. J'ai vu des méthodes comme des handlers et des run et rien ne marchait, alors toute aide serait la bienvenue, merci beaucoup. :)

38
Timmo

Ajoutez le code suivant dans votre méthode onCreate ():

Thread thread = new Thread() {

  @Override
  public void run() {
    try {
      while (!thread.isInterrupted()) {
        Thread.sleep(1000);
        runOnUiThread(new Runnable() {
          @Override
          public void run() {
            // update TextView here!
          }
        });
      }
    } catch (InterruptedException e) {
    }
  }
};

thread.start();

Ce code démarre un thread qui dort 1000 millisecondes à chaque tour.

98
endian

C'est une très vieille question et je suis sûr qu'il y a beaucoup de ressources. Mais ce n'est jamais trop répandre la Parole pour être du côté sûr. Actuellement, si quelqu'un d'autre veut atteindre les objectifs du PO, vous pouvez utiliser: Android.widget.TextClock.

Documentation TextClock ici .

Voici ce que j'ai utilisé: 

<Android.widget.TextClock
    Android:id="@+id/digitalClock"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:timeZone="GMT+0000" <!--Greenwich -->
    Android:format24Hour="dd MMM yyyy   k:mm:ss"
    Android:format12Hour="@null"
    Android:textStyle="bold"
    Android:layout_alignParentEnd="true" />
18
AuroMetal

En prolongeant la réponse de @endian, vous pouvez utiliser un fil de discussion et appeler une méthode pour mettre à jour TextView. Vous trouverez ci-dessous un code que j'ai composé sur place.

Java.util.Date noteTS;
String time, date;
TextView tvTime, tvDate;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.deskclock);

    tvTime = (TextView) findViewById(R.id.tvTime);
    tvDate = (TextView) findViewById(R.id.tvDate);

    Thread t = new Thread() {

        @Override
        public void run() {
            try {
                while (!isInterrupted()) {
                    Thread.sleep(1000);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            updateTextView();
                        }
                    });
                }
            } catch (InterruptedException e) {
            }
        }
    };

    t.start();
}

private void updateTextView() {
    noteTS = Calendar.getInstance().getTime();

    String time = "hh:mm"; // 12:00
    tvTime.setText(DateFormat.format(time, noteTS));

    String date = "dd MMMMM yyyy"; // 01 January 2013
    tvDate.setText(DateFormat.format(date, noteTS));
}
17
Adam

Si vous voulez afficher l'heure sur textview, alors mieux utiliser Chronometer ou TextClock

Using Chronometer: Ceci a été ajouté dans l’API 1. Il a beaucoup d’options pour le personnaliser.

Your xml

<Chronometer
    Android:id="@+id/chronometer"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:textSize="30sp" />

Your activity

Chronometer mChronometer=(Chronometer) findViewById(R.id.chronometer);
mChronometer.setBase(SystemClock.elapsedRealtime());
mChronometer.start();

Using TestClock: ce widget est introduit dans l'API de niveau 17. Personnellement, j'aime Chronometer. 

Your xml

<TextClock
    Android:id="@+id/textClock"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_marginTop="30dp"
    Android:format12Hour="hh:mm:ss a"
    Android:gravity="center_horizontal"
    Android:textColor="#d41709"
    Android:textSize="44sp"
    Android:textStyle="bold" />

Ça y est, vous avez terminé.

Vous pouvez utiliser n'importe lequel de ces deux widgets. Cela vous facilitera la vie.

13
Shakeeb Ayaz

Vous pouvez utiliser Timer au lieu de Thread. C'est tout mon code

package dk.tellwork.tellworklite.tabs;

import Java.util.Timer;
import Java.util.TimerTask;

import Android.annotation.SuppressLint;
import Android.app.Activity;
import Android.os.Bundle;
import Android.os.Handler;
import Android.os.Message;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.Button;
import Android.widget.TextView;
import dk.tellwork.tellworklite.MainActivity;
import dk.tellwork.tellworklite.R;

@SuppressLint("HandlerLeak")
public class HomeActivity extends Activity {
    Button chooseYourAcitivity, startBtn, stopBtn;
    TextView labelTimer;
    int passedSenconds;
    Boolean isActivityRunning = false;
    Timer timer;
    TimerTask timerTask;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tab_home);

        chooseYourAcitivity = (Button) findViewById(R.id.btnChooseYourActivity);
        chooseYourAcitivity.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                //move to Activities tab
                switchTabInActivity(1);
            }
        });

        labelTimer = (TextView)findViewById(R.id.labelTime);
        passedSenconds = 0;

        startBtn = (Button)findViewById(R.id.startBtn);
        startBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if (isActivityRunning) {
                    //pause running activity
                    timer.cancel();
                    startBtn.setText(getString(R.string.homeStartBtn));
                    isActivityRunning = false;
                } else {
                    reScheduleTimer();
                    startBtn.setText(getString(R.string.homePauseBtn));
                    isActivityRunning = true;
                }
            }
        });

        stopBtn = (Button)findViewById(R.id.stopBtn);
        stopBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                timer.cancel();
                passedSenconds = 0;
                labelTimer.setText("00 : 00 : 00");
                startBtn.setText(getString(R.string.homeStartBtn));
                isActivityRunning = false;
            }
        });
    }

    public void reScheduleTimer(){
        timer = new Timer();
        timerTask = new myTimerTask();
        timer.schedule(timerTask, 0, 1000);
    }

    private class myTimerTask extends TimerTask{
        @Override
        public void run() {
            // TODO Auto-generated method stub
            passedSenconds++;
            updateLabel.sendEmptyMessage(0);
        }
    }

    private Handler updateLabel = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            //super.handleMessage(msg);

            int seconds = passedSenconds % 60;
            int minutes = (passedSenconds / 60) % 60;
            int hours = (passedSenconds / 3600);
            labelTimer.setText(String.format("%02d : %02d : %02d", hours, minutes, seconds));
        }
    };

    public void switchTabInActivity(int indexTabToSwitchTo){
        MainActivity parentActivity;
        parentActivity = (MainActivity) this.getParent();
        parentActivity.switchTab(indexTabToSwitchTo);
    }
}
5
NamPham

Utilisez plutôt TextSwitcher (pour l'animation de transition de texte Nice) et le minuteur.

1
K. Oulebsir

Il serait préférable que vous utilisiez une tâche Async utilisant un minuteur

 Timer LAIATT = new Timer();
    TimerTask LAIATTT = new TimerTask()
    {
        @Override
        public void run()
        {
            LoadAccountInformationAsyncTask LAIAT = new LoadAccountInformationAsyncTask();
            LAIAT.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        }
    };
    LAIATT.schedule(LAIATTT, 0, 1000);
1

Vous pouvez également utiliser TimerTask pour cela.

Voici une méthode 

private void setTimerTask() {
    long delay = 3000;
    long periodToRepeat = 60 * 1000; /* 1 mint */
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                 //   do your stuff here.
                }
            });
        }
    }, 3000, 3000);
}
1
Khemraj

Ce code fonctionne pour moi ..

//Get Time and Date
private String getTimeMethod(String formate)
{
    Date date = new Date();
    SimpleDateFormat dateFormat = new SimpleDateFormat(formate);
    String formattedDate= dateFormat.format(date);
    return formattedDate;
}

//this method is used to refresh Time every Second
private void refreshTime() //Call this method to refresh time
{
    new Timer().schedule(new TimerTask() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    txtV_Time.setText(getTimeMethod("hh:mm:ss a")); //hours,Min and Second with am/pm
                    txtV_Date.setText(getTimeMethod("dd-MMM-yy")); //You have to pass your DateFormate in getTimeMethod()          
                };
            });
        }
    }, 0, 1000);//1000 is a Refreshing Time (1second)
}
1
Fra Red