多语言展示
当前在线:238今日阅读:84今日分享:32

Android4.1.1添加12小时制AM/PM显示

在Android4.1.1上把时间设置为12小时制时,没有“AM/PM”或“上午/下午”区别显示,对比于原生系统,里面也是没有,而现在很多款手机里倒是有该功能,查查代码将相应显示添加进去。
方法/步骤
1

1、状态栏的时间:

2

在frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java文件中发现有如下定义:

3

private static final int AM_PM_STYLE = AM_PM_STYLE_GONE;

4

设置为AM_PM_STYLE_GONE刚好表示不显示AM和PM,而该样式在这个文件里也有定义,可设置为如下:

5

AM_PM_STYLE_NORMAL:此时显示的字体大小与时间刚好一致;AM_PM_STYLE_SMALL:此时显示的字体大小比时间略小,靠下;AM_PM_STYLE_GONE:不显示AM或PM;

6

此处我把其设置为NORMAL,这比较符合大家的整体感觉,尤其语言切换为中文时,“上午/下午”是会显示在时间前面,如果是英文时,“AM/PM”是显示在时间后面。

7

2、锁屏界面的时间:

8

跟踪代码最终发现是在frameworks/base/core/java/com/android/internal/widget/DigitalClock.java文件中的updateTime()函数,每次解锁界面出现时会调用该函数更新时间信息,在该函数中有如下语句:

9

mAmPm.setIsMorning(mCalendar.get(Calendar.AM_PM) == 0);

10

其中mAmPm的类型为该文件中定义的class AmPm,在其构造函数中有如下语句:

11

// mAmPmTextView = (TextView) parent.findViewById(R.id.am_pm);

12

这个mAmPmTextView 没有关联的资源,那么每次调用setIsMorning函数时并不会更新到这个TextView,当然无法显示“AM/PM”了,发现从Android4.0开始就在构造函数里把上面的语句注释掉了,也发现没有am_pm这个资源ID。

13

在updateTime函数中会设置mTimeDisplayForeground和mTimeDisplayBackground两个TextView的文本内容,其中mTimeDisplayBackground在onFinishInflate函数中有如下设置:

14

mTimeDisplayBackground.setVisibility(View.INVISIBLE);

15

自然updateTime后无影响该TextView,故而等会注意mTimeDisplayForeground的处理即可,发现在updateTime函数中有如下语句:

16

CharSequence newTime = DateFormat.format(mFormat, mCalendar);mTimeDisplayForeground.setText(newTime);

17

看到了时间格式化处理,其中mFormat为最终格式化的格式,在onFinishInflate函数中会调用setDateFormat函数进行配置,其中在setDateFormat函数中有如下语句:

18

mFormat = android.text.format.DateFormat.is24HourFormat(getContext()) ? M24 : M12;

19

在这个文件中有如下定义:

20

private final static String M12 = 'h:mm'; private final static String M24 = 'kk:mm';

21

既然setIsMorning函数无作用,那么只能在格式上作文章了,故而把上面的M12修改为:

22

private final static String M12 = 'h:mmaa';

23

这样就在时间格式上多了AM/PM内容,也省了多语言处理。

24

本以为这样处理就一切OK,后来发现锁屏界面显示的时间字体大小、字体不支持中文显示,故而进行了如下修改:

25

把如下语句:

26

private static final String SYSTEM_FONT_TIME_FOREGROUND = SYSTEM + 'AndroidClock_Highlight.ttf';

27

修改为如下内容:

28

private static final String SYSTEM_FONT_TIME_FOREGROUND = SYSTEM + 'DroidSansFallback.ttf';

29

在onFinishInflate函数中的如下语句:

30

mTimeDisplayForeground.setTypeface(sForegroundFont);

31

后面添加如下语句:

32

mTimeDisplayForeground.setTextSize(mTimeDisplayForeground.getTextSize()-20);

33

至此,基本功能及格式处理都完成了,后继可继续美化界面处理。END

推荐信息