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. :)
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.
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" />
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));
}
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.
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);
}
}
Utilisez plutôt TextSwitcher
(pour l'animation de transition de texte Nice) et le minuteur.
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);
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);
}
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)
}