【问题标题】:Update TextView Every Second每秒更新 TextView
【发布时间】:2013-01-26 16:57:29
【问题描述】:

我环顾四周,到目前为止我尝试过的似乎没有任何效果......

    @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 方法每秒钟左右更新或刷新一次,所以我的时钟实际上像它应该做的那样工作。我见过像处理程序和运行这样的方法,但没有任何效果,所以任何帮助都会非常感谢。 :)

【问题讨论】:

  • “我见过诸如处理程序和 run 方法之类的东西,但没有任何效果” - “没有任何效果”到底是什么意思?

标签: android date time textview clock


【解决方案1】:

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

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

【讨论】:

  • 现在工作非常感谢。 :) 我会投票给你,但我的声誉不够高,抱歉
  • 哦,一件事,可以说将其设置为 500 毫秒而不是 1000 毫秒是“安全的”吗?
  • 这个方法一点都不好,它让“MAIN”线程休眠1000,这是有害的!
  • 我用这个,但是当我回到这个活动时遇到问题,我的第二个区别是增加了 2 到 5 甚至更多......就像第一次时间 00:01,00:02,00:03 , 第二次 00:01, 00:03,00:05, 第三次 00:01,00:05,随机继续。你能帮帮我吗?
  • 完美。可以正常工作。
【解决方案2】:

这是一个非常古老的问题,我敢肯定那里有很多资源。但是为了安全起见,传播这个词永远不会太多。目前,如果其他人想要实现 OP 的要求,您可以使用:android.widget.TextClock

TextClock 文档here.

这是我用过的:

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

【讨论】:

    【解决方案3】:

    如果你想在 textview 上显示时间,最好使用 ChronometerTextClock

    使用 Chronometer:这是在 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();
    

    使用 TextClock:这个小部件是在 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" />
    

    就是这样,你完成了。

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

    【讨论】:

      【解决方案4】:

      扩展@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));
      }
      

      【讨论】:

      • 当活动停止时,即在 onStop() 中,它也应该停止
      【解决方案5】:

      您可以使用 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);
          }
      }
      

      【讨论】:

        【解决方案6】:

        此代码对我有用..

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

        【讨论】:

          【解决方案7】:

          改用TextSwitcher(用于漂亮的文本过渡动画)和计时器。

          【讨论】:

            【解决方案8】:

            您也可以为此使用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);
            }
            

            【讨论】:

              【解决方案9】:

              如果你只是使用一个 AsyncTask 使用类似这样的 Timer 运行会更好

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

              【讨论】:

                【解决方案10】:

                java 8 lamdas:

                Timer timer = new Timer();
                timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        runOnUiThread(() -> {
                            //code here...
                            String str = getDeltaTimeHumanString(instant,Instant.now()) 
                            myTextView.setText(str);
                        });
                    }
                }, 1000, 1000);
                

                简单

                【讨论】:

                • 谢谢兄弟,辛苦了!
                【解决方案11】:

                我你使用 Kotlin 这种方式可以帮助你:

                val thread: Thread = object : Thread() {
                            override fun run() {
                                try {
                                    while (!this.isInterrupted) {
                                        sleep(1000)
                                        runOnUiThread {
                                            // update TextView And Random number here!
                                            val rnds = (0..7).random()
                                            tvBanner.text = textBanner[rnds]
                                            
                                        }
                                    }
                                } catch (e: InterruptedException) {
                                }
                            }
                        }
                
                
                thread.start()
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-11-07
                  • 1970-01-01
                  • 2019-06-02
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多