每秒更新TextView

我环顾四周,似乎没有任何工作从我迄今为止尝试…

@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)); 

我基本上希望setText方法更新或刷新每秒左右,所以我的时钟实际上就像它应该做的。 我见过像处理程序和运行的方法,没有任何工作,所以任何帮助,这将是非常感谢。 🙂

Solutions Collecting From Web of "每秒更新TextView"

在你的onCreate()方法中添加下面的代码:

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

这段代码启动一个每轮睡眠1000毫秒的线程。

扩展@endian的答案,你可以使用一个线程并调用一个方法来更新TextView。 下面是我当场编写的一些代码。

 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)); } 

这是一个非常古老的问题,我相信这里有很多资源。 但传播这个词在安全方面绝不是太多。 目前,如果别人想要实现OP所要求的,可以使用: android.widget.TextClock

TextClock文档在这里 。

这是我用过的:

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

您可以使用Timer而不是Thread。 这是完整的我的代码

 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); } } 

如果你想在textview上显示时间,那么最好使用Chronometer或TextClock

使用天文台 :这是添加在API 1.它有很多选项来定制它。

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(); 

使用TestClock :这个小部件在API级别17中引入。我个人喜欢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" /> 

就是这样,你完成了。

您可以使用这两个小部件中的任何一个。 这会让你的生活变得轻松。

使用TextSwitcher (用于漂亮的文本转换animation)和计时器。

你也可以使用TimerTask

这是一个方法

 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); }