Android:在标准TimePicker中更改时间分隔符?

时间:2014-10-25 14:29:18

标签: android timepicker

如何更改标准时间分隔符。到:在Android应用程序中? 我使用的是minSDK 15和targetSDK 20。

time separator

1 个答案:

答案 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(":");
        }
    }
}

那不适用于Android L!

所描述的方法对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作为分隔符以提供与本地格式(即本地化)的一致性。

如果您认为必须覆盖此行为,则可以使用上述方法,但请记住这样做会违反本地化甚至各种应用程序的一致性。