Intereting Posts
Разница между content_main.xml и activity_main.xml? Android, указанный для свойства 'signedConfig.storeFile', не существует Android-студийный файловый обозреватель, не отображающий файлы в папке с данными Как я могу убедиться, что мое приложение доступно только для телефонов на Android Market? Градуальная сборка Задача Javadoc не работает с «неизвестным тегом: attr» Редактировать текст без автозамены Как изменить размер изображения gif в android Как установить edittext, чтобы показать кнопку поиска или ввести кнопку на клавиатуре? Как узнать размер MTU для Android-смартфона Сессия: была сделана попытка запросить новые разрешения для сеанса с ожидающим запрос Как реализовать этот тип Progressbar в android с помощью xml-файла Ошибка в тестовом коде Geofence для Android? Кто-нибудь может подтвердить? Под контейнеры в потоке Ошибка при открытии потокового видео Ошибка: не удалось найти цель с хэш-строкой 'android-14' в: Открыть Android SDK Manager

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

ура

Solutions Collecting From Web of "Android: как отображать часы обновления в TextView"

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

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

Обновление системных часов не похоже на обновление хронометра. Мы говорим о времени, измененном на минуту (системные часы минуты и 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 не будет обновляться до следующей минуты.

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

ОБНОВИТЬ:

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

Виджет 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> 

В Activity добавьте прослушиватель textchage в DigitalClock, его подкласс textview, таким образом, мы можем добавить textchangedkistener, чтобы получить обновленное время и установить время на ваше текстовое представление, как вы хотите

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

Я рекомендую TextClock (From API 17), также, пожалуйста, не используйте DigitalClock (устарел от API 17), так как это вызовет MEMORY LEAK и приведет к исключению из памяти.