我有一个TimePickerDialog来设置时间,该时间设置为TextView以便显示。现在,我需要帮助将TimePicker(在TimePickerDialog内部)的时间间隔设置为15分钟。我已经看到有一个与TimePicker相关的间隔为15分钟的问题,但是我不知道如何将其应用于TimePickerDialog,因为我不知道如何使用在TimePickerDialog内部创建的TimePicker。我是Android的新手,在这件事上完全迷路了。提前致谢。

最佳答案

通过使用@Rizwan中的thisthis其他线程的组合,我想出了一个组合解决方案,允许在TimePickerDialog中任意分钟增量。主要问题是,大多数功能都被android TimePickerDialogTimePicker类隐藏,并且似乎没有

  • 扩展TimePickerDialog以使我们更容易访问
  • 使用反射到达显示屏内部并访问所需的位(请参见下文)
  • 重新布线分钟“NumberPicker”以显示我们的值
  • 重新布线TimePicker以接收和返回NumberPicker中的值,以兑现我们的自定义增量。
  • 阻止onStop(),以便它不会在关闭时重置该值。

  • 警告

    到达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源。

    10-08 08:03