java - TimePickerDialog 在滚动分钟时禁用小时更改

标签 java android time android-timepicker timepickerdialog

当我滚动分钟时,Android Timepickerdialog 会不合逻辑地更改小时数。我在 timepickerdialog 中将分钟间隔设置为 30 分钟,因此分钟的值为 00 和 30。例如,当我将小时设置为 00 并将分钟从 00 更改为 30 时,小时减少一小时,所以现在是23:30 而我应该拥有的是 00:30。我意识到这不会发生在三星设备上,但会发生在所有其他制造商的设备上。有什么方法可以在滚动分钟时禁用小时更改吗?

这是我的代码

public class CustomTimePickerDialog extends TimePickerDialog {

    private int TIME_PICKER_INTERVAL = 30;
    private TimePicker mTimePicker;
    private final OnTimeSetListener mTimeSetListener;
    public int interval1 = 1;

    public CustomTimePickerDialog(Context context, OnTimeSetListener listener,
                                  int hourOfDay, int minute, boolean is24HourView, int interval) {

        super(context, TimePickerDialog.THEME_HOLO_LIGHT, null, hourOfDay,
                minute / interval, is24HourView);

        TIME_PICKER_INTERVAL = interval;

        mTimeSetListener = listener;

    }

    @Override
    public void updateTime(int hourOfDay, int minuteOfHour) {
        mTimePicker.setCurrentHour(hourOfDay);
        mTimePicker.setCurrentMinute(minuteOfHour / TIME_PICKER_INTERVAL);

    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        switch (which) {
            case BUTTON_POSITIVE:
                if (mTimeSetListener != null) {
                    mTimeSetListener.onTimeSet(mTimePicker, mTimePicker.getCurrentHour(),
                            mTimePicker.getCurrentMinute() * TIME_PICKER_INTERVAL);
                }
                break;
            case BUTTON_NEGATIVE:
                cancel();
                break;
        }
    }

    @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        try {
            Class<?> classForid = Class.forName("com.android.internal.R$id");
            Field timePickerField = classForid.getField("timePicker");
            mTimePicker = (TimePicker) findViewById(timePickerField.getInt(null));
            Field field = classForid.getField("minute");

            NumberPicker minuteSpinner = (NumberPicker) mTimePicker
                    .findViewById(field.getInt(null));
            minuteSpinner.setMinValue(0);
            minuteSpinner.setMaxValue((60 / TIME_PICKER_INTERVAL) - 1);
            List<String> displayedValues = new ArrayList<String>();
            for (int i = 0; i < 60; i += TIME_PICKER_INTERVAL) {
                displayedValues.add(String.format("%02d", i));
            }
            minuteSpinner.setDisplayedValues(displayedValues
                    .toArray(new String[displayedValues.size()]));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

我知道至少有一个类似的问题,但没有解决问题的答案。 Android time picker auto change hours when minutes get scrolled

编辑:我还注意到,当我将分钟间隔更改为 15 时,效果很好。例如,当我将分钟数从 45 增加到 00 时,小时数增加一。当我将分钟数从 00 分钟减少到 45 小时时,同样的事情倒退了,小时数减少了一个。当分钟间隔为 6 时也是如此。所以问题仅出在 30 分钟间隔上,我的软件中必须有 30 分钟间隔。

最佳答案

我像下面这样解决了。只需在 minuteSpinner.setDisplayedValues()

之后调用分钟更改的监听器
minuteSpinner.setOnValueChangedListener { picker, oldVal, newVal ->
    // Declare this listener to prevent hour change 
}

我一直在寻找与您相同的问题,但找不到方法。所以我自己尝试了这个那个,找到了最简单的解决方案!

关于java - TimePickerDialog 在滚动分钟时禁用小时更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48801375/

相关文章:

java - 如何解决错误 "Current Request is not a multipart request"

java - 如何使用带有空值和泛型类型的 JComboBox?

Android "suspended (Exception X)"堆栈跟踪

java - 使用java和mysql数据库重命名重复文件

java - 将具有 transient 属性的对象写入流 (Java)

android - 从 ArrayList 释放位图的有效方法

android - Android : Empty error message in onFailure of AsyncHttpClient

c++ - 计算线程内的时间

java - 如何将时间与我的 table 匹配?

java - 如何在 "Time Difference"中获取 "since/ago"?这可能不使用任何图书馆吗?