2013-04-22 4 views
0

Я пытался создать программу, которая будет выводить рабочие цифровые часы, которые позволят мне быстро получить доступ к дате и времени. У меня есть код для разбора времени, однако у меня возникают трудности с обновлением textview. У меня есть следующее:Обновление TextView с часами

`public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    timer = (TextView)findViewById(R.id.timer); 

    time = new Time(); 
    time.setToNow(); 

    timeString = time.toString(); 
    changeTime = Parser(timeString); 


    time.setToNow(); 
    timeString = time.toString(); 
    changeTime = Parser(timeString); 

    timer.setText(changeTime); 
    } 
    private String Parser(String time){ 

    String year = time.substring(0, 4); 
    String month = time.substring(4,6); 
    String day = time.substring(6, 8); 
    String hour = time.substring(9,11); 
    String minute = time.substring(11, 13); 
    String second = time.substring(13, 15); 

    String finalTime = hour + ":" + minute + ":" + second + " " + day + " " + month + " " + year; 
    //String finalTime = second; 
    return finalTime; 


}` 

Как поместить это в цикл, чтобы постоянно обновлять текстовое представление.

Спасибо за любую помощь, которую вы можете мне дать.

+0

вы можете использовать 'Thread',' 'TimerTask' или Handler.postdelayed' для обновления TextView постоянно вместо того, чтобы использовать цикл –

ответ

0

Объявление обработчика для обновления TextView в потоке пользовательского интерфейса.

private Handler mHandler = new Handler() { 
@Override 
public void handleMessage(Message msg) { 
    time = new Time(); 
    time.setToNow(); 

    timeString = time.toString(); 
    changeTime = Parser(timeString); 
    timer.setText(changeTime); 
} 
}; 

Запуск TimeTask, который будет обновлять ваш TextView

int initialDelay = 1000; //first update in miliseconds 
int period = 5000;  //nexts updates in miliseconds  

Timer timer = new Timer(); 
TimerTask task = new TimerTask() { 
    public void run() { 
     Message msg = new Message(); 
     mHandler.sendMessage(msg); 
    } 
}; 
timer.scheduleAtFixedRate(task, initialDelay, period); 
+0

это работало, спасибо вы так много! – JJJ1106

1

Вы должны использовать поток таймера. Вы также можете упростить преобразование времени и даты с помощью Calendar и можете оптимизировать создание строк с помощью format. Этот пример будет обновлять TextView каждую секунду (1000 мс):

Timer t = new Timer(); 
timer = (TextView)findViewById(R.id.timer); 

t.scheduleAtFixedRate(new TimerTask() 
{ 
    @Override 
    public void run() { 
     Calendar c = Calendar.getInstance(); 
     String finalTime = String.format(Locale.US, "%d:%d:%d %d/%d/%d", c.get(Calendar.HOUR), c.get(Calendar.MINUTE), c.get(Calendar.SECOND), c.get(Calendar.DAY_OF_MONTH), c.get(Calendar.MONTH), c.get(Calendar.YEAR)); 

     runOnUiThread(timer.setText(finalTime)); 
    } 

}, 1000); 
+0

похоже, что время форматирования отображается, однако оно, похоже, не обновляется. Любые идеи о том, что я могу делать неправильно? – JJJ1106

+1

@ JJJ1106, Да - я исправил свой пост. Вам нужно создать экземпляр «Calendar» внутри «TimerTask». Если это хорошо для вас, подумайте о том, чтобы принять это как ответ из-за его простоты. – Phil

0

Это можно легко сделать с помощью нити в андроиде, но, как вы хотите, чтобы доступ к пользовательскому интерфейсу, так потоки не будут работать помочь вам. Вы должны лучше выбрать обработчик или TimerTask

Однако асинхронные задачи также работать на Non-UI потоке, чтобы сделать обработчик внутри TimerTask ..

Timer t=Timer(); 

    t.scheduleAtFixedRate(new TimerTask(new Runnable() 
     { 
    public void run(){ 
    Handler h=new Handler(getMainLooper()); 
    h.post(new Runnable(
){public void run(){ 
//get the time here and set the textview here as here it has access to the main ui 
}}); 
    } 
    } 
    ), long delay, Long period); 

Извините за плохой код форматирование ... но он будет работать вы

0

Неплохая практика начать обновление представления с помощью бесконечных сообщений обработчика (попробуйте посмотреть на уровень процессора вашего процесса). Лучше и более элегантным способом является регистрация BroadcastReceiver, который инициирует обновление.

public class Clock extends LinearLayout { 

    private Calendar mCalendar; 
    private LinearLayout mLayoutTime; 
    private TextView mAMPMText; 
    private TextView mDateText; 
    private TextView mTimeText; 
    private View mSendFeedback; 
    private boolean mAttached; 

    private final Handler mHandler = new Handler(); 
    SimpleDateFormat dateFormatter = new SimpleDateFormat("EEE, MMM d, yyyy"); 
    SimpleDateFormat timeFormatter = new SimpleDateFormat("h:mm"); 

    public Clock(final Context context, int layoutResourceID, int dateResId, int meResId,int amPmResId) { 
     super(context); 
     LayoutInflater layoutInflater = LayoutInflater.from(context); 
     View view = layoutInflater.inflate(layoutResourceID, null); 
     addView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 
     mAMPMText = (TextView) view.findViewById(amPmResId); 
     mTimeText = (TextView) view.findViewById(timeResId); 
     mDateText = (TextView) view.findViewById(dateResId);  
    } 

    @Override 
    protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 

     if (!mAttached) { 
      mAttached = true; 
      IntentFilter filter = new IntentFilter(); 

      filter.addAction(Intent.ACTION_TIME_TICK); 
      filter.addAction(Intent.ACTION_TIME_CHANGED); 
      filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); 

      getContext().registerReceiver(mIntentReceiver, filter, null, mHandler); 
     } 

     // NOTE: It's safe to do these after registering the receiver since the receiver always runs 
     // in the main thread, therefore the receiver can't run before this method returns. 

     // The time zone may have changed while the receiver wasn't registered, so update the Time 
     mCalendar = Calendar.getInstance(); 

     // Make sure we update to the current time 
     onTimeChanged(); 
     updateView(); 
    } 

    @Override 
    protected void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
     if (mAttached) { 
      getContext().unregisterReceiver(mIntentReceiver); 
      mAttached = false; 
     } 
    } 

    private void updateView(){ 
     mTimeText.setText(timeFormatter.format(mCalendar.getTime())); 
     mDateText.setText(dateFormatter.format(mCalendar.getTime())); 
     mAMPMText.setText(mCalendar.get(Calendar.AM_PM) == 0 ? "AM" : "PM"); 
    } 

    private void onTimeChanged() { 
     mCalendar.setTime(new Date()); 

     updateContentDescription(mCalendar); 
    } 

    private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals(Intent.ACTION_TIMEZONE_CHANGED)) { 
       String tz = intent.getStringExtra("time-zone"); 
       mCalendar.setTimeZone(TimeZone.getTimeZone(tz)); 
      } 

      onTimeChanged(); 

      updateView(); 
     } 
    }; 

    private void updateContentDescription(Calendar calendar) { 
     setContentDescription(calendar.toString()); 
    } 
} 

макет (может быть сделано лучше)

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:gravity="center_vertical" 
    android:orientation="horizontal" > 

    <LinearLayout 
     android:id="@+id/layout_time" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" > 

     <TextView 
      android:id="@+id/time_txt" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:includeFontPadding="true" /> 

     <TextView 
      android:id="@+id/am_pm_txt" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="AM" /> 
    </LinearLayout> 

    <TextView 
     android:id="@+id/date_txt" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

</RelativeLayout> 
Смежные вопросы