我有一个TimePickerDialog来设置时间,该时间设置为TextView以便显示。现在,我需要帮助将TimePicker(在TimePickerDialog内部)的时间间隔设置为15分钟。我已经看到有一个与TimePicker相关的间隔为15分钟的问题,但是我不知道如何将其应用于TimePickerDialog,因为我不知道如何使用在TimePickerDialog内部创建的TimePicker。我是Android的新手,在这件事上完全迷路了。提前致谢。
最佳答案
通过使用@Rizwan中的this和this其他线程的组合,我想出了一个组合解决方案,允许在TimePickerDialog
中任意分钟增量。主要问题是,大多数功能都被android TimePickerDialog
和TimePicker
类隐藏,并且似乎没有
TimePickerDialog
以使我们更容易访问TimePicker
以接收和返回NumberPicker
中的值,以兑现我们的自定义增量。 警告
到达UI内部的主要问题是,元素由可能更改的id引用,甚至ID的名称也不能永远保持相同。话虽如此,这是行之有效的,稳定的解决方案,并且可能在可预见的将来行之有效。在我看来,空白catch块应警告用户界面已更改,并应恢复为默认的行为(增加1分钟)。
解决方案
private class DurationTimePickDialog extends TimePickerDialog
{
final OnTimeSetListener mCallback;
TimePicker mTimePicker;
final int increment;
public DurationTimePickDialog(Context context, OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView, int increment)
{
super(context, callBack, hourOfDay, minute/increment, is24HourView);
this.mCallback = callBack;
this.increment = increment;
}
@Override
public void onClick(DialogInterface dialog, int which) {
if (mCallback != null && mTimePicker!=null) {
mTimePicker.clearFocus();
mCallback.onTimeSet(mTimePicker, mTimePicker.getCurrentHour(),
mTimePicker.getCurrentMinute()*increment);
}
}
@Override
protected void onStop()
{
// override and do nothing
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
try
{
Class<?> rClass = Class.forName("com.android.internal.R$id");
Field timePicker = rClass.getField("timePicker");
this.mTimePicker = (TimePicker)findViewById(timePicker.getInt(null));
Field m = rClass.getField("minute");
NumberPicker mMinuteSpinner = (NumberPicker)mTimePicker.findViewById(m.getInt(null));
mMinuteSpinner.setMinValue(0);
mMinuteSpinner.setMaxValue((60/increment)-1);
List<String> displayedValues = new ArrayList<String>();
for(int i=0;i<60;i+=increment)
{
displayedValues.add(String.format("%02d", i));
}
mMinuteSpinner.setDisplayedValues(displayedValues.toArray(new String[0]));
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}
构造函数接受增量值并保留一些其他引用。请注意,这省略了错误检查,我们更喜欢
60%increment==0
onCreate 使用UI字段的名称和反射来发现当前位置。再次,这省略了错误检查,并且应该是“故障安全”的,即,如果出现问题,则恢复为默认行为。
onClick 被覆盖以将正确的分钟值返回给回调监听器
覆盖 onStop覆盖,以防止在对话框关闭时第二次返回(不正确的)索引值。继续,自己尝试。
其中大部分来自挖掘TimePickerDialog源。