如何更改标准时间分隔符。到:在Android应用程序中? 我使用的是minSDK 15和targetSDK 20。
答案 0 :(得分:8)
这个答案讨论了TimePicker类,因为OP指定它作为bounty中的一个要求,并且随着元素在Android 5 / Lollipop的发布中获得了一些代码返工。
无法使用一个简单的调用简单地修改分隔符文本。分隔符文本在TimePicker.setDividerText()
内部设置,这是一种私有方法,意味着它也不能被覆盖。为了更加努力,分频器textview变量mDivider
被设置为私有,这意味着我们无法直接访问分频器textview。
该问题的一个简单解决方案是在构造函数设置后简单地覆盖该值。为此,我们创建了自己的TimePicker子类,尝试查找分隔符并设置其值。只要布局与AOSP匹配,这将正常工作。 查看OEM皮肤和耸肩
请参阅source of the android.widget.TimePicker class作为参考。假设正在调查 android-l-preview_r2 标记,请检查第91行以获取mDivider
变量的声明,并检查setDividerText()
方法的第531-553行。
import android.content.Context;
import android.content.res.Resources;
import android.util.AttributeSet;
import android.widget.TextView;
import android.widget.TimePicker;
public class CustomTimePicker extends TimePicker {
public CustomTimePicker(Context context) {
super(context);
init();
}
public CustomTimePicker(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CustomTimePicker(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
TextView divider = (TextView) findViewById(Resources.getSystem()
.getIdentifier("divider", "id", "android"));
// the divider doesn't exist in the old-school widget style
if (divider != null) {
divider.setText(":");
}
}
}
所描述的方法对KitKat有效,但在针对L进行编译时不再使用。如果检查TimePicker on android-5.0.0_r2,您会发现样式的处理被卸载到单独的委托类。 TimePickerClockDelegate类似乎是类似于遗留选择器的类。
关于私有变量和方法的问题仍然存在于Android 5.0.0上,而新的结构使得更复杂。如果你仍然认为你想要打破本地化(参见下面的你应该这样做吗?部分),你可能最好使用自定义的TimePicker实现。一个好的起点可能是选择新的TimePicker和TimePickerClockDelegate类,合并它们并删除抽象层并修改分隔符文本设置代码,如在KitKat版本中所做的那样。无论如何,这超出了一个简单而有用的答案的范围,因为采用这种方式会产生许多副作用,例如破坏系统范围的可主题性,并且应该被明智地考虑。
不是。
TimePicker实际上会选择:
字符作为默认分隔符,以防出现任何问题,但它会更喜欢局部变化高于一切。
这意味着如果您使用的locale更喜欢将时间写为HH:mm
,则选择器会自动使用:
作为分隔符,但如果您的语言环境使用{{1}然后选择器将简单地使用HH.mm
作为分隔符。如果某个区域设置会以.
的格式写入时间,则选择器会自动调整并使用HH/mm
作为分隔符以提供与本地格式(即本地化)的一致性。
如果您认为必须覆盖此行为,则可以使用上述方法,但请记住这样做会违反本地化甚至各种应用程序的一致性。