para - manual de programacion android pdf
Actualizar TextView cada segundo (8)
Agregue el siguiente código en su método 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();
Este código inicia un hilo que duerme 1000 milisegundos por ronda.
He mirado alrededor y parece que nada funciona según lo que he intentado hasta ahora ...
@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));
Básicamente quiero que los métodos de setText se actualicen o actualicen cada segundo, para que mi reloj realmente funcione como debería. He visto métodos como controladores y ejecución y nada funcionó, así que cualquier ayuda con esto sería genial, gracias. :)
Es una pregunta muy antigua y estoy seguro de que hay muchos recursos por ahí. Pero nunca es demasiado difundir la palabra para estar en el lado seguro. Actualmente, si alguna otra persona quiere lograr lo que OP pidió, puede usar: android.widget.TextClock
.
La documentación de TextClock here .
Esto es lo que he usado:
<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" />
Extendiendo la respuesta de @endian, podría usar un hilo y llamar a un método para actualizar el TextView. A continuación hay un código que inventé en el momento.
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));
}
Puede usar el temporizador en lugar del hilo. Esto es todo mi código
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);
}
}
Sería mejor si usaras una AsyncTask corriendo usando un temporizador como este
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);
Si desea mostrar el tiempo en la vista de texto, mejor utilice Chronometer o here
Usando Chronometer : Esto fue agregado en API 1. Tiene muchas opciones para personalizarlo.
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();
Usando TestClock : Este widget se presenta en el nivel API 17. Personalmente me gusta el cronómetro.
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" />
Eso es todo, has terminado.
Puedes usar cualquiera de estos dos artilugios. Esto hará que tu vida sea más fácil.
También puede usar TimerTask
para eso.
Aquí hay un método
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);
}
Use TextSwitcher
(para una agradable animación de transición de texto) y el temporizador en su lugar.