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

bja*_*jar 4 android timepicker

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

时间分隔符

Val*_*ons 8

这个答案讨论了TimePicker类,因为OP指定它作为赏金中的一个要求,并且随着元素在Android 5/Lollipop的发布中获得了一些代码返工.


怎么做?

无法使用一个简单的调用简单地修改分隔符文本.分隔符文本在内部设置,TimePicker.setDividerText()其中是一个私有方法,这意味着它也不能被覆盖.为了使其更难,分隔器textview变量mDivider被设置为私有,这意味着我们无法直接访问分隔器textview.

该问题的一个简单解决方案是在构造函数设置后简单地覆盖该值.为此,我们创建了自己的TimePicker子类,尝试查找分隔符并设置其值.只要布局与AOSP匹配,这将正常工作.看看OEM皮肤和耸肩

请参阅android.widget.TimePicker类的源代码作为参考.假设正在调查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(":");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这不适用于Android L!

所描述的方法对于KitKat是有效的,但在针对L进行编译时不再使用.如果android-5.0.0_r2检查TimePicker,您会发现该样式的处理被卸载到单独的委托类.该TimePickerClockDelegate类似乎是类似于传统选取器之一.

关于私有变量和方法的问题仍然存在于Android 5.0.0上,新的结构使事情变得更复杂.如果您仍然认为您想要打破本地化(请参阅下面的" 您是否应该这样做?"部分),您最好使用自定义TimePicker实现.一个好的起点可能是选择新的TimePicker和TimePickerClockDelegate类,合并它们并删除抽象层并修改分隔符文本设置代码,就像在KitKat版本中一样.无论如何,这超出了一个简单而有用的答案的范围,因为采用该路线会产生许多副作用,例如打破系统范围的可主题性,并且应该真正被明智地考虑.


你应该这样做吗?

并不是的.

TimePicker实际上会选择该:字符作为默认分隔符,以防出现任何问题,但它会更喜欢局部变化高于一切.

这意味着如果您使用的语言环境更喜欢将时间写为HH:mm,则选择器将自动:用作分隔符,但如果您的语言环境使用,HH.mm则选择器将仅用.作分隔符.如果某个区域设置会以格式写入时间HH/mm,则选择器会自动调整并/用作分隔符以提供与本地格式(即本地化)的一致性.

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