我正在写一个应用程序,用户需要指定一个给定的时间点,但我似乎无法弄清楚如何设置用户可以选择的分钟值,只使用增量5而不是增量1.如何更改Android TimePicker分钟间隔?
简而言之,当通过可用量的用户滚动,他/她必须只看到0,5,10,15等
预先感谢您。
我正在写一个应用程序,用户需要指定一个给定的时间点,但我似乎无法弄清楚如何设置用户可以选择的分钟值,只使用增量5而不是增量1.如何更改Android TimePicker分钟间隔?
简而言之,当通过可用量的用户滚动,他/她必须只看到0,5,10,15等
预先感谢您。
您可以通过编程来完成此操作。
pickStartTime = (TimePicker)findViewById(R.id.StartTime);
pickStartTime.setOnTimeChangedListener(mStartTimeChangedListener);
int nextMinute = 0;
接下来,将OnTimeChangedListener
如下图所示
private TimePicker.OnTimeChangedListener mStartTimeChangedListener =
new TimePicker.OnTimeChangedListener() {
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
updateDisplay(view, startDate, hourOfDay, minute);
}
};
private TimePicker.OnTimeChangedListener mNullTimeChangedListener =
new TimePicker.OnTimeChangedListener() {
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {}
};
而且,
private void updateDisplay(TimePicker timePicker, Date date, int hourOfDay, int minute)
{
nextMinute = nextMinute+5;
// remove ontimechangedlistener to prevent stackoverflow/infinite loop
timePicker.setOnTimeChangedListener(mNullTimeChangedListener);
// set minute
timePicker.setCurrentMinute(nextMinute);
// look up ontimechangedlistener again
timePicker.setOnTimeChangedListener(mStartTimeChangedListener);
// update the date variable for use elsewhere in code
date.setMinutes(nextMinute);
}
所有相关答案需要你设置一个OnTimeChangedListener。 我的决心是你的android延伸TimePicker,并修改它的构造函数:
// minute
mMinuteSpinner = (NumberPicker) findViewById(R.id.minute);
mMinuteSpinner.setMinValue(0);
mMinuteSpinner.setMaxValue(3);
mMinuteSpinner.setDisplayedValues(new String[]{"0", "15", "30", "45"});
mMinuteSpinner.setOnLongPressUpdateInterval(100);
mMinuteSpinner.setFormatter(NumberPicker.getTwoDigitFormatter());
所以你可以有你想要的时间间隔。
这对我们很有用,但是我们对微调微调的搜索有点不明白,因为它不知道“R.id.minute”是什么。 'R.id.minute'从哪里来? – Dan2552 2014-02-03 15:40:14
@ Dan2552'R.id.minute'是TimePicker中使用的分钟旋钮的标识。你可以在'
对不起,现在评论,但如果你正在扩展'TimePicker'并想访问'NumberPicker's的ID,你可以通过'com.android.internal.R.id.minute/hour'来完成。 – Asaf 2014-07-17 20:23:00
搜索网络后,我没有找到最简单的解决方案。
所以我决定分享:
你可以使用反射!
以下代码使用10分钟的时间间隔,但您可以选择要在DISPLAYED_MINS数组中使用的分钟数。
private final static String[] DISPLAYED_MINS = { "0", "10", "20", "30", "40", "50" };
private NumberPicker getMinuteSpinner(TimePicker t)
{
try
{
Field f = t.getClass().getDeclaredField("mMinuteSpinner"); // NoSuchFieldException
f.setAccessible(true);
return (NumberPicker) f.get(t); // IllegalAccessException
}
catch (Exception e)
{
Log.e("timepicker","field name has been changed, check grepcode");
return null;
}
}
当您创建timepicker:
final TimePicker dpStartDate = (TimePicker) view.findViewById(R.id.dpStartDate);
NumberPicker startMinSpiner = getMinuteSpinner(dpStartDate);
if (null != startMinSpiner)
{
startMinSpiner.setMinValue(0);
startMinSpiner.setMaxValue(DISPLAYED_MINS.length - 1);
startMinSpiner.setDisplayedValues(DISPLAYED_MINS);
}
但不要忘记,getCurrentMinute()的DISPLAY_MINS数组中返回选定分钟。 为了获得分:
int theTime = 0;
for (String number: DISPLAYED_MINS) {
int theNumber = Integer.parseInt(number);
if (theNumber % 5 != 0) {
theNumber = ((int)(theNumber/5)) * 5;
}
if (theNumber == dpStartDate.getCurrentMinute()) {
theTime = theNumber;
break;
}
}
仅供参考,这不再适用于Android L/Lollipop。 – 2014-12-04 00:33:32
要确保你与API兼容21+,请确保您有TimePicker以下属性:
android:timePickerMode="spinner"
然后这里是你如何设置的时间间隔编程。这个方法倒在标准TimePicker如果分字段不能发现:
private static final int INTERVAL = 5;
private static final DecimalFormat FORMATTER = new DecimalFormat("00");
private TimePicker picker; // set in onCreate
private NumberPicker minutePicker;
public void setMinutePicker() {
int numValues = 60/INTERVAL;
String[] displayedValues = new String[numValues];
for (int i = 0; i < numValues; i++) {
displayedValues[i] = FORMATTER.format(i * INTERVAL);
}
View minute = picker.findViewById(Resources.getSystem().getIdentifier("minute", "id", "android"));
if ((minute != null) && (minute instanceof NumberPicker)) {
minutePicker = (NumberPicker) minute;
minutePicker.setMinValue(0);
minutePicker.setMaxValue(numValues - 1);
minutePicker.setDisplayedValues(displayedValues);
}
}
public int getMinute() {
if (minutePicker != null) {
return (minutePicker.getValue() * INTERVAL);
} else {
return picker.getCurrentMinute();
}
}
这段代码的rusult是唯一的量,我可以看到的是5,也许我实现它错了吗? – JeanBrand 2013-04-24 09:33:28
你必须增加它,看我编辑的答案 – 2013-04-24 09:55:02
它的工作原理是用户只能选择5的增量,但显示结果的顶部和底部的选项不是5的增量,你知道我可以如何将微调器中可用的金额绑定为5的增量? – JeanBrand 2013-04-29 12:23:44