Руководство Android TextClock
View more Tutorials:
В Android, TextClock это подкласс у TextView. Он используется для отображения текущей даты (date) и времени (time) системы.


TextClock требует API Level 17 (Android 4.2) или новее. Поэтому если вы хотите использовать TextClock в своем проекте, вам нужно изменить значение у minSdkVersion в файле build.gradle (Module: app), удостоверьтесь что он больше или равен 17.

TextClock не имеется наготове в Palette окна дизайна, наверно потому что он не является распространенным компонентом. Поэтому вам нужно использовать следующий XML код, чтобы добавить его в интерфейс.
<!-- IMPORTANT NOTE: You may get "Exception raised during rendering" error on design screen. --> <TextClock android:id="@+id/textClock" android:layout_width="wrap_content" android:layout_height="wrap_content" android:format12Hour="hh:mm:ss a" />
Примечание: Возможно вы получите оповещение ошибки, когда вы попытаетесь смоделировать интерфейс с присутствиемTextClock. Данная проблема была подтверждена на Android Studio 3.x, 4.0. Некоторые люди отправляли отчет в Google, чтобы они разрешили проблему:
Exception raised during rendering. java.lang.NullPointerException at android.content.ContentResolver.registerContentObserver(ContentResolver.java:2263) at android.widget.TextClock.registerObserver(TextClock.java:626) at android.widget.TextClock.onAttachedToWindow(TextClock.java:545) at android.view.View.dispatchAttachedToWindow(View.java:19575) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437) at android.view.AttachInfo_Accessor.setAttachInfo(AttachInfo_Accessor.java:42) at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:335) at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:396) at com.android.tools.idea.layoutlib.LayoutLibrary.createSession(LayoutLibrary.java:209) at com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:608) at com.android.tools.idea.rendering.RenderTask.lambda$inflate$6(RenderTask.java:734) at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
В любом случае я разрешил эту проблему, создав подкласс TextClock и использовал ее (Смотрите в примере).

TextClock имеет два режиме отображения времени это:
- 12Hour Mode (Режим 12 часов)
- 24Hour Mode (Режим 24 часа)
Для начала, объект TextClock вызовет метод is24HourModeEnabled() чтобы проверить использует ли устройство пользователя режим 24 часа? Примечание: Пользователь может поменять режим 12 часов на режим 24 часа и обратно в Settings устройстве.
Возомжны 2 варианта:
1 - Если устройство пользователя находится в режиме 24 часа.
- TextClock отобразит время по формату значения возвращенного от getFormat24Hour(), если он не является null.
- Наоборот, он отобразит время по формату значения возвращенного от getFormat12Hour(), если он не является null.
- Наоборот, он отобразит время по формату по умолчанию, например "h:mm a".
2 - Если устройство пользователя находится в режиме 12 часов.
- TextClock отобразит время по формату значения возвращенного от getFormat12Hour(), если он не является null.
- Наоборот, отобразит время по формату значения возвращенного от getFormat24Hour(), если он не является null.
- Наоборот, он отобразит время по формату по умолчанию, например "h:mm a".

OK, на Android Studio создайте новый project:
- File > New > New Project > Empty Activity
- Name: TextClockExample
- Package name: org.o7planning.textclockexample
- Language: Java
TextClock требует API Level 17 (Android 4.2) или новее. Поэтому если вы хотите использовать TextClock в своем project, вам нужно изменить значение minSdkVersion в файле build.gradle (Module: app), удостоверьтесь что оно больше или равно 17.

Как было сказано выше, в можете получить оповещение ошибки при попытке смоделировать интерфейс с присутствием TextClock. Возможно Google решит данную проблему в новых версиях Android Studio. Но сейчас, чтобы разрешить эту проблему мы создаем класс MyTextClock расширенный из TextClock, и используем его.
MyTextClock.java
package org.o7planning.textclockexample; import android.content.Context; import android.os.Build; import android.util.AttributeSet; import android.widget.TextClock; import androidx.annotation.RequiresApi; public class MyTextClock extends TextClock { public MyTextClock(Context context) { super(context); // this.setDesigningText(); } public MyTextClock(Context context, AttributeSet attrs) { super(context, attrs); // this.setDesigningText(); } public MyTextClock(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); // this.setDesigningText(); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public MyTextClock(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); // this.setDesigningText(); } private void setDesigningText() { // The default text is displayed when designing the interface. this.setText("11:30:00"); } // // Fix error: Exception raised during rendering. // // java.lang.NullPointerException // at android.content.ContentResolver.registerContentObserver(ContentResolver.java:2263) // at android.widget.TextClock.registerObserver(TextClock.java:626) // at android.widget.TextClock.onAttachedToWindow(TextClock.java:545) // at android.view.View.dispatchAttachedToWindow(View.java:19575) // at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437) // at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437) // at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437) // at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437) // at android.view.AttachInfo_Accessor.setAttachInfo(AttachInfo_Accessor.java:42) // at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:335) // at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:396) // at com.android.tools.idea.layoutlib.LayoutLibrary.createSession(LayoutLibrary.java:209) // at com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:608) // at com.android.tools.idea.rendering.RenderTask.lambda$inflate$6(RenderTask.java:734) // at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590) // at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) // at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) // at java.lang.Thread.run(Thread.java:748) @Override protected void onAttachedToWindow() { try { super.onAttachedToWindow(); } catch(Exception e) { } } }
Дизайн интерфейса приложения:
Примечание: Вам нужен Re-Build project, и потом вы увидите как MyTextClock появится на Palette окна дизайна.


Настроить textSize, textStyle, textColor, format12Hour, format24Hour для TextClock.

activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <!-- 12 Hour Mode --> <org.o7planning.textclockexample.MyTextClock android:id="@+id/myTextClock" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="32dp" android:format12Hour="hh:mm:ss a" android:format24Hour="@null" android:textColor="#80CC28" android:textSize="45dp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <!-- 24 Hour Mode --> <org.o7planning.textclockexample.MyTextClock android:id="@+id/myTextClock2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="32dp" android:format12Hour="@null" android:format24Hour="yyyy-MM-dd HH:mm:ss" android:textColor="#F1511B" android:textSize="30dp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/myTextClock" /> </androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java
package org.o7planning.textclockexample; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextClock; public class MainActivity extends AppCompatActivity { private TextClock textClock; private TextClock textClock2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.textClock = (TextClock) this.findViewById(R.id.myTextClock); this.textClock2 = (TextClock) this.findViewById(R.id.myTextClock2); // Disable 24 Hour mode (To use 12 Hour mode). // (Make sure getFormat12Hour() is not null). this.textClock.setFormat24Hour(null); // Disable 12 Hour mode (To use 24 Hour mode). // (Make sure getFormat24Hour() is not null). this.textClock2.setFormat12Hour(null); } }