Руководство Android TextClock

View more Tutorials:

1- Android TextClock

В 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".

2- Пример TextClock

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

View more Tutorials: