Android 时钟TextClock 使用及源码分析,学习Android开发的步骤,

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

android:layout_height=“match_parent”>

<TextView

android:id=“@+id/tv_is24HourModeEnabled”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:layout_marginTop=“@dimen/dimen_10”

android:textSize=“@dimen/text_size_16”

android:padding=“@dimen/dimen_10”/>

<TextClock

android:id=“@+id/tc_timeText_12”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:gravity=“center”

android:textColor=“@color/black”

android:textSize=“30sp”

android:textStyle=“bold”/>

<TextClock

android:id=“@+id/tc_dateText_12”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:gravity=“center”

android:textColor=“@color/black”

android:textSize=“20sp”/>

<TextView

android:id=“@+id/tv_12hour”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:layout_marginTop=“@dimen/dimen_10”

android:textSize=“@dimen/text_size_16”

android:padding=“@dimen/dimen_10”/>

<TextClock

android:id=“@+id/tc_timeText_24”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:layout_marginTop=“@dimen/dimen_20”

android:format12Hour=“hh:mm:ss”

android:format24Hour=“HH:mm:ss”

android:gravity=“center”

android:textColor=“@color/black”

android:textSize=“30sp”

android:textStyle=“bold”/>

<TextClock

android:id=“@+id/tc_dateText_24”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:format12Hour=“yyyy/MM/dd E”

android:format24Hour=“yyyy/MM/dd E”

android:gravity=“center”

android:textColor=“@color/black”

android:textSize=“20sp”/>

<TextView

android:id=“@+id/tv_24hour”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:layout_marginTop=“@dimen/dimen_10”

android:textSize=“@dimen/text_size_16”

android:padding=“@dimen/dimen_10”/>

主界面代码

public class TextClockActivity extends AppCompatActivity {

private TextClock tc_timeText_12,tc_dateText_12,tc_timeText_24,tc_dateText_24;

private TextView tv_12hour,tv_24hour,tv_is24HourModeEnabled;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_textview_textclock);//加载布局文件

initView();

}

private void initView() {

tv_is24HourModeEnabled = findViewById(R.id.tv_is24HourModeEnabled);

tc_timeText_12 = findViewById(R.id.tc_timeText_12);

tc_dateText_12 = findViewById(R.id.tc_dateText_12);

tv_12hour = findViewById(R.id.tv_12hour);

//setTimeZone使用(UTC-7)无效,

//原因:源码未对UTC+(-)进行处理,下面有具体的源码分析

tc_timeText_12.setTimeZone(“America/Los_Angeles”);//有效

tc_dateText_12.setTimeZone(“America/Los_Angeles”);//有效

//tc_timeText_12.setTimeZone(“GMT+7:00”);//有效

//tc_dateText_12.setTimeZone(“GMT+7:00”);//有效

tc_dateText_12.setFormat24Hour(“HH:mm”);

tc_dateText_12.setFormat12Hour(“yyyy/MM/dd E”);

// EEEE:星期五 ;E/EE/EEE:周五;a:上午/下午

tc_dateText_12.setFormat24Hour(“yyyy年MM月dd日 EEEE aa HH:mm:ss”);

String format12 = “\n12小时模式格式:”+tc_timeText_12.getFormat12Hour();

format12 = format12+“\n24小时模式格式:”+tc_timeText_12.getFormat24Hour();

format12 = format12+“\n时区:”+tc_timeText_12.getTimeZone();

tv_12hour.setText(“Format:”+format12);

tc_timeText_24 = findViewById(R.id.tc_timeText_24);

tc_dateText_24 = findViewById(R.id.tc_dateText_24);

tv_24hour = findViewById(R.id.tv_24hour);

String format = “\n24小时模式格式:”+tc_timeText_24.getFormat24Hour();

format = format+“\n12小时模式格式:”+tc_timeText_24.getFormat12Hour();

format = format+“\n时区:”+tc_timeText_24.getTimeZone();

String timeZome =TimeZone.getDefault().getDisplayName(true, TimeZone.SHORT);

format = format+“\n时区:”+timeZome;

tv_24hour.setText(“Format:”+format);

String is24HourMode = String.format(“系统当前是否使用 24 小时模式:%s。”, tc_dateText_24.is24HourModeEnabled());

tv_is24HourModeEnabled.setText(is24HourMode);

}

}

示例分析

手机系统默认是24小时格式

例一的时间/日期显示格式在代码中设置;

例一的12小时制格式返回:「ah:mm」 这个是默认值。

例二的时间/日期显示格式在xml文件中设置;

例二未设置时区所以时区返回null,可通过下面代码获取系统时区来显示

TimeZone.getDefault().getDisplayName(true, TimeZone.SHORT);

源码分析


setFormat12Hour()

public void setFormat12Hour(CharSequence format) {

mFormat12 = format;

chooseFormat();

onTimeChanged();

}

setFormat24Hour()

public void setFormat24Hour(CharSequence format) {

mFormat24 = format;

chooseFormat();

onTimeChanged();

}

看完**「setFormat12Hour」「setFormat24Hour」,你会发现他们除了各自格式赋值,后面都调用了「chooseFormat()」** 和**「onTimeChanged()」**,下面咱看看这俩方法是干什么的。

chooseFormat()

先进行了判断是不是24小时制,后面用到了**「abc()」**;mDescFormat12,mDescFormat24用于内容描述,下面讲到。咱们接着往下看abc()

/**

* Selects either one of {@link #getFormat12Hour()} or {@link #getFormat24Hour()}

* depending on whether the user has selected 24-hour format.

*/

private void chooseFormat() {

final boolean format24Requested = is24HourModeEnabled();

LocaleData ld = LocaleData.get(getContext().getResources().getConfiguration().locale);

if (format24Requested) {

mFormat = abc(mFormat24, mFormat12, ld.timeFormat_Hm);

mDescFormat = abc(mDescFormat24, mDescFormat12, mFormat);

} else {

mFormat = abc(mFormat12, mFormat24, ld.timeFormat_hm);

mDescFormat = abc(mDescFormat12, mDescFormat24, mFormat);

}

boolean hadSeconds = mHasSeconds;

mHasSeconds = DateFormat.hasSeconds(mFormat);

if (mShouldRunTicker && hadSeconds != mHasSeconds) {

if (hadSeconds) getHandler().removeCallbacks(mTicker);

else mTicker.run();

}

}

abc()

  • a不为null,返回a;否则继续往下看;

  • b不为null,返回b;否则返回c;

  • 例如:24小时制:a=24小时格式;b=12小时格式,c默认格式

说白了就是上面的:「如何格式化日期和时间的规则。」

/**

* Returns a if not null, else return b if not null, else return c.

*/

private static CharSequence abc(CharSequence a, CharSequence b, CharSequence c) {

return a == null ? (b == null ? c : b) : a;

}

onTimeChanged()

获取系统当前时间并展示。这里多了一个**「setContentDescription()」**;咱后面看看是干嘛的

/**

* Update the displayed time if this view and its ancestors and window is visible

*/

@UnsupportedAppUsage

private void onTimeChanged() {

mTime.setTimeInMillis(System.currentTimeMillis());

setText(DateFormat.format(mFormat, mTime));

setContentDescription(DateFormat.format(mDescFormat, mTime));

}

setContentDescription()

设置 控件 的内容描述。

@RemotableViewMethod

public void setContentDescription(CharSequence contentDescription) {

//mContentDescription:简要描述视图,主要用于辅助功能支持。

if (mContentDescription == null) {

if (contentDescription == null) {

return;

}

} else if (mContentDescription.equals(contentDescription)) {

return;

}

mContentDescription = contentDescription;

final boolean nonEmptyDesc = contentDescription != null && contentDescription.length() > 0;

if (nonEmptyDesc && getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) {

setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);

notifySubtreeAccessibilityStateChangedIfNeeded();

} else {

notifyViewAccessibilityStateChangedIfNeeded(

AccessibilityEvent.CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION);

}

}

setTimeZone()

设置时区

public void setTimeZone(String timeZone)

{

mTimeZone = timeZone;

createTime(timeZone);

onTimeChanged();

}

设置时区调用了两个方法**「createTime()」** 和**「onTimeChanged()」**,onTimeChanged()获取系统当前时间并展示,咱们在上面讲过了,这里咱重点看createTime()

createTime()

判断是使用设置的时区还是用系统时区

private void createTime(String timeZone) {

if (timeZone != null) {

mTime = Calendar.getInstance(TimeZone.getTimeZone(timeZone));

} else {

mTime = Calendar.getInstance();

}

}

从上面看出不管timeZong是否为null都会调用**「Calendar.getInstance()」,区别在是否传参,还有「TimeZone.getTimeZone(timeZone)」** 在下面咱们看看这两个方法。

TimeZone.getTimeZone(timeZone)

这个是重点,这里面包含了:

最后

愿你有一天,真爱自己,善待自己。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

mTime = Calendar.getInstance(TimeZone.getTimeZone(timeZone));

} else {

mTime = Calendar.getInstance();

}

}

从上面看出不管timeZong是否为null都会调用**「Calendar.getInstance()」,区别在是否传参,还有「TimeZone.getTimeZone(timeZone)」** 在下面咱们看看这两个方法。

TimeZone.getTimeZone(timeZone)

这个是重点,这里面包含了:

最后

愿你有一天,真爱自己,善待自己。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-zvJKdniL-1713680405549)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值