2013-02-11 21 views
29

Etrafa baktım ve hiçbir şey şimdiye kadar denedim ne çalışıyor görünüyor ...Güncelleme TextView'un Her İkinci

@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)); 
Temelde setText yöntemleri güncelleme veya her saniye kadar yenilemek isteyen

bu yüzden saatim aslında yapması gerektiği gibi çalışıyor. İşleyicileri ve koşmak gibi yöntemler gördüm ve hiçbir şey işe yaramadı, bu yüzden bu konuda herhangi bir yardım çok teşekkür ederim. :) senin onCreate() yönteminde kod aşağıdaki

+0

"Ive işleyicileri ve çalışma yöntemi ve hiçbir şey gibi şeyler gördüm böyle bir Timer şey kullanarak çalışan kullanılırsa daha iyi olurdu olduğunu çalıştı - "tam olarak ne" hiçbir şey işe yaramadı "demek? – Egor

cevap

83

Ekleme:

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

Bu kod 1000 milisaniye her yuvarlak uyur bir iş parçacığı başlatır.

+0

Çalışmaya şimdi çok teşekkürler. :) Id oy ama sen yeterince yüksek bir itibar üzgünüm – Timmo

+0

Ah bir şey, 'güvenli' 1000 yerine 500 milisaniye ayarlamak için konuşmak için? – Timmo

+13

Bu yöntem hiç de iyi değil, "ANA" iş parçacığını 1000 için uyutur, bu da zararlı olur! –

12

@endian'ın yanıtını genişleterek, bir iş parçacığı kullanabilir ve TextView'ı güncelleştirmek için bir yöntemi çağırabilirsiniz. Aşağıda, üzerinde oluşturduğum bir kod var.

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

Girilen tüm girişler için teşekkürler. – Timmo

+2

numaralı yardım için teşekkürler, etkinlik durduğunda, yani onStop() içinde, ayrıca durdurulmalıdır – seema

1

Kullanım TextSwitcher (güzel yazı geçiş animasyonu için) ve bunun yerine zamanlayıcı.

5

Zamanlayıcıyı İş Parçacığı yerine kullanabilirsiniz. Bu benim bütün kodum

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

Çok eski bir soru ve eminim orada çok fazla kaynak var. Ama kelimeyi güvenli tarafta olmak için yaymak asla çok fazla değildir. Halihazırda, eğer birisi OP'nin istediği şeyi elde etmek istiyorsa, aşağıdakileri kullanabilirsiniz: android.widget.TextClock.

TextClock belgeleri here. İşte

ben kullandım ne:

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

Eğer textview o zaman daha iyi kullanılması zamandan göstermek istiyorsanız Chronometer veya Kronometre kullanma TextClock

: Bu It has API 1'de eklendi özelleştirmek için çok seçenek. TestClock kullanma

Your activity

Chronometer mChronometer=(Chronometer) findViewById(R.id.chronometer); 
mChronometer.setBase(SystemClock.elapsedRealtime()); 
mChronometer.start(); 

<Chronometer android:id="@+id/chronometer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="30sp" /> 

Your xml

: Bu widget şahsen Kronometre gibi API düzey 17.I tanıtıldı.

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

Thats bunu, bitirdiniz.

Bu iki parçacığı herhangi birini kullanabilirsiniz. Bu hayatınızı kolaylaştıracak.

0

Bunun için TimerTask'u da kullanabilirsiniz.İşte

bir yöntem

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

sadece bir AsyncTask

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