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

    最近发现在Android4.1.1上把时间设置为12小时制时,没有“AM/PM”或“上午/下午”区别显示,对比于Nexus 7,里面也是没有,而现在很多款手机里倒是有该功能。查看了一下源码,发现了如下的蛛丝马迹:
    1、状态栏的时间:
       在frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java文件中发现有如下定义:
       private static final int AM_PM_STYLE = AM_PM_STYLE_GONE;
       设置为AM_PM_STYLE_GONE刚好表示不显示AM和PM,而该样式在这个文件里也有定义,可设置为如下:
       AM_PM_STYLE_NORMAL:此时显示的字体大小与时间刚好一致;
       AM_PM_STYLE_SMALL:此时显示的字体大小比时间略小,靠下;
       AM_PM_STYLE_GONE:不显示AM或PM;
       此处我把其设置为NORMAL,这比较符合大家的整体感觉,尤其语言切换为中文时,“上午/下午”是会显示在时间前面,如果是英文时,“AM/PM”是显示在时间后面。
    2、锁屏界面的时间:
       跟踪代码最终发现是在frameworks/base/core/java/com/android/internal/widget/DigitalClock.java文件中的updateTime()函数,每次解锁界面出现时会调用该函数更新时间信息,在该函数中有如下语句:
       mAmPm.setIsMorning(mCalendar.get(Calendar.AM_PM) == 0);
       其中mAmPm的类型为该文件中定义的class AmPm,在其构造函数中有如下语句:
       // mAmPmTextView = (TextView) parent.findViewById(R.id.am_pm);
       这个mAmPmTextView 没有关联的资源,那么每次调用setIsMorning函数时并不会更新到这个TextView,当然无法显示“AM/PM”了,发现从4.0开始就在构造函数里把上面的语句注释掉了,也发现没有am_pm这个资源ID。在updateTime函数中会设置mTimeDisplayForeground和mTimeDisplayBackground两个TextView的文本内容,其中mTimeDisplayBackground在onFinishInflate函数中有如下设置:
       mTimeDisplayBackground.setVisibility(View.INVISIBLE);
       自然updateTime后无影响该TextView,故而等会注意mTimeDisplayForeground的处理即可,发现在updateTime函数中有如下语句:
       CharSequence newTime = DateFormat.format(mFormat, mCalendar);
       mTimeDisplayForeground.setText(newTime);
       看到了时间格式化处理,其中mFormat为最终格式化的格式,在onFinishInflate函数中会调用setDateFormat函数进行配置,其中在setDateFormat函数中有如下语句:
       mFormat = android.text.format.DateFormat.is24HourFormat(getContext()) ? M24 : M12;
       在这个文件中有如下定义:
       private final static String M12 = "h:mm"; 
       private final static String M24 = "kk:mm";
       既然setIsMorning函数无作用,那么只能在格式上作文章了,故而把上面的M12修改为:
       private final static String M12 = "h:mmaa"; 
       这样就在时间格式上多了AM/PM内容,也省了多语言处理,本以为这样处理就一切OK,后来发现锁屏界面显示的时间字体大小、字体不支持中文显示,故而进行了如下修改:
       把private static final String SYSTEM_FONT_TIME_FOREGROUND = SYSTEM + "AndroidClock_Highlight.ttf";
       修改为:
       private static final String SYSTEM_FONT_TIME_FOREGROUND = SYSTEM + "DroidSansFallback.ttf"; 
       在onFinishInflate函数中的如下语句:
       mTimeDisplayForeground.setTypeface(sForegroundFont);
       后面添加如下语句:
       mTimeDisplayForeground.setTextSize(mTimeDisplayForeground.getTextSize()-20);
       至此,基本功能及格式处理都完成了,后继可继续美化界面处理。
       参考网址:http://blog.csdn.net/z_guijin/article/details/7992393
                 http://developer.android.com/reference/android/text/format/DateFormat.html

你可能感兴趣的:(Android-APK)