Android TextClock设置format12Hour后模拟器正常实体机显示错误如何解决
问题原因
- 仅为TextClock配置了
format12Hour属性,未配置对应format24Hour属性。三星设备如果开启系统24小时制,TextClock会优先使用24小时格式渲染,未配置的情况下会调用系统默认格式,导致显示不符合预期。 - 时间大小单位使用错误:
tvTime的textSize属性写为45dp,字体大小应使用sp单位,避免系统字体调整时显示异常。 - 未指定固定格式化Locale,不同厂商系统默认语言区域不同,会导致
MMM这类月份缩写的显示结果和模拟器不一致。
修复方案
- 给两个TextClock都添加
format24Hour属性,和format12Hour配置保持一致,确保无论系统开启12/24小时制,显示格式都统一。 - 将
tvTime的textSize单位从dp改为sp。 - 如果需要固定显示英文月份,不受系统语言影响,可在代码中手动指定Locale。
修复后XML代码
<TextClock android:id="@+id/tvDate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:format12Hour="dd MMM yyyy" android:format24Hour="dd MMM yyyy" android:textColor="#FFFFFF" android:textSize="20sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="@+id/tvTime" app:layout_constraintStart_toStartOf="@+id/tvTime" app:layout_constraintTop_toBottomOf="@+id/tvTime" tools:visibility="visible" /> <TextClock android:id="@+id/tvTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:format12Hour="hh:mm:ss" android:format24Hour="hh:mm:ss" android:textColor="#FFFFFF" android:textSize="45sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:visibility="visible" />
固定英文月份的补充代码(可选)
如果需要强制显示英文月份,在对应Activity的onCreate方法中添加如下代码即可:
// Kotlin 示例 val tvDate = findViewById<TextClock>(R.id.tvDate) tvDate.format12Hour = android.text.format.DateFormat.format("dd MMM yyyy", java.util.Locale.ENGLISH) tvDate.format24Hour = android.text.format.DateFormat.format("dd MMM yyyy", java.util.Locale.ENGLISH)
// Java 示例 TextClock tvDate = findViewById(R.id.tvDate); tvDate.setFormat12Hour(android.text.format.DateFormat.format("dd MMM yyyy", java.util.Locale.ENGLISH)); tvDate.setFormat24Hour(android.text.format.DateFormat.format("dd MMM yyyy", java.util.Locale.ENGLISH));
内容的提问来源于stack exchange,提问作者Khamnueng Pongsakorn
相关产品推荐
相关产品推荐

