Intereting Posts
AndroidHttpClient против HttpUrlConnection для API уровня 9 и выше Как получить название города по широте и долготе в андроиде? Как заставить Android Studio использовать относительные пути? Как я могу представить отношение многих к многим с Android Room? В чем разница между List и ArrayList? Пользовательский словарь (не клавиатура) для Android-приложений Использование кнопки backstack и back в viewpager Как автоматически отображать активность через 5 секунд Скрытие / отображение панели инструментов при прокрутке фрагмента на вкладках ListView выталкивает другие виды с экрана Как я могу автоматически очищать вывод logcat перед каждым запуском в Android Studio? Как я могу просмотреть команду CLI, выполненную заданием Gradle в Android Studio? Как я могу установить цвет штриховой шкалы андроидов? (Не цвет звезд, а ГРАНИЦА) Как я могу видеть, какие аквариумы активны Использование MultiDexApplication приводит к тому, что тест Robolectric для класса приложения прерывается

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 и приведет к исключению из памяти.