Die Anleitung zu Android TextClock

View more Tutorials:

1- Android TextClock

Im  Android ist  TextClock ein Sub-Klasse von  TextView. Es wird benutzt um das aktuelle Datum und die Zeit vom System anzuzeigen.
TextClock fordert  API Level 17 (Android 4.2) oder neuer auf. Deshald wenn Sie  TextClock in Ihrem Projekt benutzen möchten, sollen Sie den Wert von  minSdkVersion in die Datei  build.gradle (Module: app). Stellen Sie sicher, dass es gleich wie oder größer als 17 ist.
TextClock ist in  Palette vom Design-Fenster nicht verfügbar, denn es ist vielleicht kein übliches Komponent. Deshalb brauchen Sie die Code  XML zu benutzen danach in die Interface hinzufügen. 
<!--
     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" />
Achtung: Sie können eine Fehlerbenachrichtung bekommen wenn Sie versuchen, die Interface mit der Anwesenheit von  TextClock zu entwerfen. Das Problem wurde in  Android Studio 3.x, 4.0 bestätigt. Einige Leuten haben die Reports nach  Google zu Behandlung geschickt:
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)
Sowieso habe ich dieses Problem gelöst, indem ich eine Unterklasse von TextClock erstellt und verwendet habe (siehe mehr im Beispiel).
TextClock hat 2 Modus zur Zeitanzeige:
  • 12Hour Mode (12Stunde-Modus)
  • 24Hour Mode (24Stunde-Modus)

Zum ersten wird das Objekt  TextClock das Method  is24HourModeEnabled() aufrufen um zu prüfen, ob das Gerät des Benutzer das 24Stunden-Modus benutzt. Achtung: Der Benutzer kann 12Stunde Modus und 24Stunde Modus in  Settings vom Gerät wechseln.
Es gibt 2 Möglichkeiten:
1 - Wenn das Gerät vom Benutzer im 24Stunde-Modus ist.
  • TextClock zeigt die Zeit gemäß dem Format des von getFormat24Hour() zurückgegebenen Werts an, falls sie nicht null ist.
  • Andernfalls wird die Zeit gemäß dem Format des von getFormat12Hour() zurückgegebenen Werts angezeigt, falls sie nicht null ist.
  • Andernfalls wird die Zeit gemäß dem Standardformat "h:mm a" angezeigt.
2 - Wenn der Gerät vom Benutzer in dem 12Stunde Modus ist.
  • TextClock zeigt die Zeit gemäß dem Format des von getFormat12Hour() zurückgegebenen Werts an, falls sie nicht null ist.
  • Andernfalls wird die Zeit gemäß dem Format des von getFormat24Hour() zurückgegebenen Werts angezeigt, falls sie nicht null ist.
  • Andernfalls wird die Zeit gemäß dem Standardformat, bsw. "h:mm a" angezeigt.
  • .

2- Das Beispiel vom TextClock

OK, Im  Android Studio erstellen Sie ein neues Projekt:
  • File > New > New Project > Empty Activity
    • Name: TextClockExample
    • Package name: org.o7planning.textclockexample
    • Language: Java
TextClock fordert  API Level 17 (Android 4.2) oder später auf. Deshalb wenn Sie   TextClock in Ihrem Projekt benutzen möchten, sollen Sie den Wert von  minSdkVersion in die Datei  build.gradle (Module: app) ändern. Stellen Sie sicher, dass es gleich wie oder größer als 17 ist.
Wie oben erwähnt, erhalten Sie möglicherweise eine Fehlerbenachrichtigung, wenn Sie versuchen, die Schnittstelle in Anwesenheit von TextClock zu entwerfen. Möglicherweise wird das Problem in späteren Versionen von Android Studio von Google behoben. Um dieses Problem zu lösen, erstellen wir zunächst die Klasse MyTextClock, die sich von TextClock aus erstreckt, und verwenden sie dann.
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)  {
        }
    }

}
Entwerfen Sie die Interface der Anwendung:
Legen Sie  textSize, textStyle, textColor, format12Hour, format24Hour für  TextClock ​​​​​​​fest.
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: