it-swarm.com.de

Aktualisieren Sie TextView jede Sekunde

Ich habe mich umgesehen und nichts scheint zu funktionieren, was ich bisher ausprobiert habe ...

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

Grundsätzlich möchte ich, dass die setText-Methoden etwa jede Sekunde aktualisiert oder aktualisiert werden, sodass meine Uhr tatsächlich so funktioniert, wie sie sollte. Ich habe Methoden wie Handler und Run gesehen und nichts hat funktioniert, also wäre jede Hilfe großartig danke. :)

38
Timmo

Fügen Sie der onCreate () - Methode folgenden Code hinzu:

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

Dieser Code startet einen Thread, der in jeder Runde 1000 Millisekunden schläft.

98
endian

Es ist eine sehr alte Frage und ich bin sicher, dass es da draußen viele Ressourcen gibt. Es ist jedoch nie zu viel, das Wort zu verbreiten, um auf der sicheren Seite zu sein. Wenn jemand anderes jemals das erreichen möchte, was das OP verlangt, können Sie Folgendes verwenden: Android.widget.TextClock.

TextClock Dokumentation hier .

Folgendes habe ich verwendet: 

<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

Wenn Sie die Antwort von @endian erweitern, können Sie einen Thread verwenden und eine Methode zum Aktualisieren der TextView aufrufen. Nachfolgend finden Sie einen Code, den ich sofort erstellt habe.

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

Wenn Sie die Zeit in Textansicht anzeigen möchten, verwenden Sie besser Chronometer oder TextClock

Using Chronometer: Dies wurde in API 1 hinzugefügt. Es hat viele Optionen zum Anpassen.

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: Dieses Widget wurde in API Level 17 eingeführt. Ich persönlich mag 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" />

Das ist es, du bist fertig.

Sie können jedes dieser beiden Widget verwenden. Das macht dein Leben leicht.

13
Shakeeb Ayaz

Sie können Timer anstelle von Thread verwenden. Das ist mein ganzer 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

Verwenden Sie stattdessen TextSwitcher (für Nice-Textübergangsanimation) und den Timer.

1
K. Oulebsir

Es wäre besser, wenn Sie gerade eine AsyncTask verwenden, die mit einem Timer läuft, etwa so

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

Sie können auch TimerTask dafür verwenden.

Hier ist eine Methode 

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

Dieser Kodex funktioniert für mich ..

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