今天学习Android,通过百度学习到了如何在TextView中显示电子时钟。期间还遇到如何设置格式的问题,与如何设置文本框内时间的更新速度。这篇博客主要讲这三个问题。

在TextView中显示电子时钟

xml代码

只需要在activity_main.xml中修改TextView标签即可,加入Android:id以及删去Android:text。源代码如下

<?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">

    <TextView
        android:id="@+id/id_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

java代码

代码思路
1.由 protected void onCreate(Bundle savedInstanceState){}中的mHandler.sendEmptyMessageDelayed(MSG_UPDATE_CURRENT_TIME, 500);在500毫秒后发送一个消息。 public void handleMessage(Message msg){}函数处理该消息。
2.public void handleMessage(Message msg){}函数中的activity.updateCurrentTime();将时间送入文本框。sendEmptyMessageDelayed(MSG_UPDATE_CURRENT_TIME, 10);10毫秒发送一个消息。
3.public void handleMessage(Message msg){}函数处理消息,处理消息时又会执行sendEmptyMessageDelayed(MSG_UPDATE_CURRENT_TIME, 10);。如此循环不间断。

package com.example.time;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;

import java.lang.ref.WeakReference;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity {
    private Handler mHandler;
    private static final int MSG_UPDATE_CURRENT_TIME = 1;
    private TextView tv_time;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_time = (TextView) this.findViewById(R.id.id_time);//tv_time与文本框绑定
        mHandler = new MyHandler(this);
        mHandler.sendEmptyMessageDelayed(MSG_UPDATE_CURRENT_TIME, 500);
    }

    private static class MyHandler extends Handler {
        private WeakReference<MainActivity> mActivity;

        public MyHandler(MainActivity activity) {
            mActivity = new WeakReference<MainActivity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            MainActivity activity = mActivity.get();
            switch (msg.what) {
                case MSG_UPDATE_CURRENT_TIME:
                    activity.updateCurrentTime();
                    sendEmptyMessageDelayed(MSG_UPDATE_CURRENT_TIME, 10);//设置文本框内时间的更新速度,现在为10毫秒更新一次
                    break;
                default:
                    break;
            }
        }
    }

    private void updateCurrentTime() {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("  hh:mm:ss:SS");//设置输出格式,当前格式为“时:分:秒:毫秒(前两位)”
        Date curDate = new Date(System.currentTimeMillis());
        String time = simpleDateFormat.format(curDate);
        tv_time.setText(time);
    }
}

设置输出时间格式

yyyy-MM-dd HH:mm:ss:SSS

y 不包含纪元的年份。不具有前导零。

yy 不包含纪元的年份。具有前导零。

yyyy 包括纪元的四位数的年份。

M 月份数字。一位数的月份没有前导零。

MM 月份数字。一位数的月份有一个前导零。

d 月中的某一天。一位数的日期没有前导零。

dd 月中的某一天。一位数的日期有一个前导零。

h 12 小时制的小时。一位数的小时数没有前导零。

hh 12 小时制的小时。一位数的小时数有前导零。

H 24 小时制的小时。一位数的小时数没有前导零。

HH 24 小时制的小时。一位数的小时数有前导零。

m 分钟。一位数的分钟数没有前导零。

mm 分钟。一位数的分钟数有一个前导零。

s 秒。一位数的秒数没有前导零。

ss 秒。一位数的秒数有一个前导零。

SSS 毫秒。可设置1位,最多可设置三位。

由SimpleDateFormat类进行设置。

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("  hh:mm:ss:SS");//设置输出格式,当前格式为“时:分:秒:毫秒(前两位)”

设置更新时间

更新时间取决于handler对象发消息的频率。该频率由函数sendMessageDelayed(Message message,long time)确定。

private static final int MSG_UPDATE_CURRENT_TIME = 1;
······
  sendEmptyMessageDelayed(MSG_UPDATE_CURRENT_TIME, 10);//设置文本框内时间的更新速度,现在为10毫秒更新一次

gitee地址

感兴趣的读者可以下载到Android studio中。
网址:https://gitee.com/wsy1328639341/time.git