Intereting Posts
Как сделать мобильное приложение для Android DLNA? Как переопределить класс в проекте библиотеки Android? Ошибка приложения при запуске, вызванная NPE в android.content.Context.getString Как плавно поворачивать карту с помощью подшипника в android Android. Повторно запускайте поток в течение таймера. Как исправить андроид-студии 2.3 Ошибка NDK? Как создать пользовательский веб-просмотр в Android? Как загрузить изображение в виде изображения из галереи? Как перекрыть элементы в LinearLayoutManager – RecyclerView (например, карты укладки) Как узнать использование памяти моего приложения в Android? Android-камера: нитки? Что должно делать то, что Автоматический инструмент перевода для Android Получить активное имя приложения в Android Добавить панель инструментов поиска по карте google, например, в приложении для родных Android. Как узнать, вызвана ли операция с помощью startActivityForResult или просто вызвана с помощью startActivity?

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