Подтвердить что ты не робот

Android: как отображать часы обновления в TextView

имеют часы, которые я хочу отобразить в TextView.

Я бы подумал, что для этого есть несколько хороших функций, но я ничего не мог найти. Я закончил тем, что использовал свой собственный метод, который использует обработчик. Что я спрашиваю, есть ли лучший (более эффективный) способ отображения часов реального времени для обновления?

private Runnable mUpdateClockTask = new Runnable() {
   public void run() {
       setTime();
       mClockHandler.postDelayed(this, 1000);
   }
};

Что мой обработчик, который запускается каждую секунду, а затем моя установленная функция времени и даты ниже

TextView mClockView;

public void setTime() {
    Calendar cal = Calendar.getInstance();
    int minutes = cal.get(Calendar.MINUTE);

    if (DateFormat.is24HourFormat(this)) {
        int hours = cal.get(Calendar.HOUR_OF_DAY);
        mClockView.setText((hours < 10 ? "0" + hours : hours) + ":" + (minutes < 10 ? "0" + minutes : minutes));
    }
    else {
        int hours = cal.get(Calendar.HOUR);
        mClockView.setText(hours + ":" + (minutes < 10 ? "0" + minutes : minutes) + " " + new DateFormatSymbols().getAmPmStrings()[cal.get(Calendar.AM_PM)]);
    }
}

Приветствия

4b9b3361

Ответ 1

Помните: преждевременная оптимизация - это корень всего зла. Поэтому только оптимизируйте, когда вы уверены (= измерили), что ваша реализация медленная/неэффективная.

Тем не менее, более эффективным методом, вероятно, было бы записать время начала через System.currentTimeMillis(), а затем периодически проверять его и вычислять разницу в минутах.

Ответ 2

Обновление системных часов не похоже на обновление хронометра. Мы говорим о времени, измененном в минуту (системные часы минуты и 00 секунд).

Использование таймера - неправильный способ сделать это. Это не только излишнее, но вы должны прибегнуть к некоторым трюкам, чтобы сделать это правильно.

Правильный способ сделать это (например, обновить TextView, показывающий время как HH: mm), использовать BroadcastReceiver следующим образом:

BroadcastReceiver _broadcastReceiver;
private final SimpleDateFormat _sdfWatchTime = new SimpleDateFormat("HH:mm");
private TextView _tvTime;

@Override
public void onStart() {
    super.onStart();
    _broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context ctx, Intent intent) {
                if (intent.getAction().compareTo(Intent.ACTION_TIME_TICK) == 0)
                    _tvTime.setText(_sdfWatchTime.format(new Date()));
            }
        };

    registerReceiver(_broadcastReceiver, new IntentFilter(Intent.ACTION_TIME_TICK));
}

@Override
public void onStop() {
    super.onStop();
    if (_broadcastReceiver != null)
        unregisterReceiver(_broadcastReceiver);
}

Система отправит это широковещательное событие в точном начале каждой минуты на основе системных часов. Однако не забывайте инициализировать свой TextView заранее (до текущего системного времени), так как, скорее всего, вы выйдете из своего интерфейса через середину минуты, а TextView не будет обновляться до следующей минуты.

Ответ 3

Ознакомьтесь с Chronometer и DigitalClock классами, которые являются расширениями класса TextView, Они должны автоматически делать то, что вы ищете. Если вам нужна дополнительная функциональность, просто взгляните на исходный код и сделайте необходимые изменения.

UPDATE:

Так как цифровые часы устарели в API 17, я бы рекомендовал вместо этого использовать Текстовые часы.

Ответ 4

Я рекомендую TextClock (из API 17), также, пожалуйста, не используйте DigitalClock (устарело из API 17), так как это вызовет УТЕЧКУ ПАМЯТИ и приведет к исключению нехватки памяти. Пожалуйста, добавьте следующий фрагмент кода в соответствующий файл layout.xml

 <TextClock
   android:id="@+id/textClock1"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:gravity="center_horizontal"
   android:textColor="#17d409" />

Это сделает свое дело, также обратите внимание, что вы можете отформатировать время отображения, как требуется, например, для получения в 12-часовом формате с секундами вы можете использовать "android: format12Hour =" hh: mm: ss a "".

Ответ 5

Виджет DigitalClock доступен в android api 1 или использует виджет TextClock в api 17

создайте макет для часов, как это сначала:

<LinearLayout 
         android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >
    <TextView android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:id="@+id/clocktext"
        android:textStyle="bold"
        android:textColor="#ffffff"
        android:layout_marginTop="30dp"
        android:textSize="50sp"
        android:text="2:46"/>
    <DigitalClock android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:id="@+id/clock"
        android:textStyle="bold"
        android:textSize="50sp"
        android:visibility="gone"
        android:textColor="#ffffff"
        />  
    </LinearLayout>       

в деятельности добавить textchage слушателя к ЭЛЕКТРОННЫЕ ЧАСЫ ИТС подкласс TextView, таким образом, мы можем добавить textchangedkistener, чтобы получить обновленное время и установите время на ваш TextView, как вы хотите

chagre = (TextView) mTopView.findViewById(R.id.clocktext);// TextView to display Time
    clock = (DigitalClock) mTopView.findViewById(R.id.clock);// DigitalClock With visibility=gone

    clock.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {}

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {}
        @Override
        public void afterTextChanged(Editable s) {

            chagre.setText(s.toString());//will be called when system clock updataes

        }
    });

Ответ 6

Вы можете использовать виджет TextClock, предоставляемый Android

<TextClock
    android:id="@+id/textClock"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:format12Hour="hh:mm:ss a"
    android:gravity="center_horizontal"
    android:textColor="#d41709"
    android:textSize="20sp"
    android:textStyle="bold" />

требуется минимальный уровень API 17

https://developer.android.com/reference/android/widget/TextClock

если вы хотите текущее время в другом текстовом представлении

Вы можете использовать приведенный ниже фрагмент кода

 tClock = (TextClock) findViewById(R.id.textClock1);
        tView = (TextView) findViewById(R.id.textview1);
        btn = (Button)findViewById(R.id.btnGet);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                tView.setText("Time: "+tClock.getText());
            }
        });
    }