How to implement android Minutes-Seconds picker?
我需要实现一个对话框,用户可以在其中输入以分钟和秒为单位的时间。例如:6分30秒。那里我还需要一个分钟数的上限(即,分钟的范围是0-10,秒的范围是0-60)。
但正如此处已讨论的那样,Android TimePicker仅显示小时和分钟。我看过几篇关于增加秒数的文章,但没什么关于删除小时数和增加秒数的文章。也许也没有办法限制通话时间。
我看过几篇推荐使用NumberPicker创建自定义时间选择器的文章,但也看到一些警告,NumberPicker仅供内部使用,不应使用。这似乎是Catch-22。
我可以尝试修改TimePicker或NumberPicker的源代码,但对于了解它们的工作原理并维护自定义版本所花费的时间,我并不感到困惑。
我想这使我得以实现自定义的Minutes-Seconds选择器。使用上下按钮移动数字看起来并不难,但是我不知道如何让用户滑动来滚动每个"滚轮"中的数字。
有什么建议么?
在使用该SO答案向TimePickerDialog添加分钟间隔后,我做了一个类似的子类,将小时数微调框的范围扩展到0-60,并将小时数:分钟微调框视为分钟:秒:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | import android.app.TimePickerDialog; import android.content.Context; import android.content.DialogInterface; import android.widget.NumberPicker; import android.widget.TimePicker; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; public class DurationPicker extends TimePickerDialog { private TimePicker timePicker; private final OnTimeSetListener callback; private int initialMinutes; public DurationPicker(Context context, OnTimeSetListener callBack, int minutes, int seconds) { super(context, callBack, minutes, seconds, true); // the last argument removes the am/pm spinner this.callback = callBack; this.initialMinutes = minutes; // we'll have to set this again after modifying the"hours" spinner this.setTitle("Set duration"); } @Override public void onClick(DialogInterface dialog, int which) { if (callback != null && timePicker != null) { timePicker.clearFocus(); callback.onTimeSet(timePicker, timePicker.getCurrentHour(), timePicker.getCurrentMinute()); } } @Override public void onAttachedToWindow() { super.onAttachedToWindow(); try { Class< ? > classForid = Class.forName("com.android.internal.R$id"); Field timePickerField = classForid.getField("timePicker"); this.timePicker = (TimePicker) findViewById(timePickerField.getInt(null)); Field field = classForid.getField("hour"); // modify the hours spinner to cover the maximum number of minutes we want to support int maxMinutes = 60; NumberPicker mHourSpinner = (NumberPicker)timePicker.findViewById(field.getInt(null)); mHourSpinner.setMinValue(0); mHourSpinner.setMaxValue(maxMinutes); List<String> displayedValues = new ArrayList<String>(); for (int i = 0; i <= maxMinutes; i++) { displayedValues.add(String.format("%d", i)); } mHourSpinner.setDisplayedValues(displayedValues.toArray(new String[0])); mHourSpinner.setValue(initialMinutes); // we can set this again now that we've modified the hours spinner } catch (Exception e) { e.printStackTrace(); } } } |
在回调中,只需将第二个参数中的值视为分钟,并将第三个参数中的值视为秒。
当"分钟"微调器设置为大于24的数字时,未来的Android版本可能会返回不正确的结果,但是我阅读了当前的TimePicker代码,并未发现任何问题。 同样,可以用秒微调器修改或替换am / pm微调器,然后选择器可以支持hour:minutes:seconds和minutes:seconds。