在android中显示具有分钟间隔的TimePicker

Ser*_*o76 50 android intervals android-timepicker

我的应用程序显示了一个TimePickerDialog来设置时间.我希望timePickerDialog以5分钟的间隔显示分钟.

这适用于此代码:

private final int TIME_PICKER_INTERVAL=5;
private boolean mIgnoreEvent=false;
…
    public TimePickerDialogs(Context arg0, OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView) {
    super(arg0, callBack, hourOfDay, minute, is24HourView);

    formato=Statics.formato;
}

@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
    //super.onTimeChanged(arg0, arg1, arg2);

    if (mIgnoreEvent)
        return;
    if (minute%TIME_PICKER_INTERVAL!=0){
        int minuteFloor=minute-(minute%TIME_PICKER_INTERVAL);
        minute=minuteFloor + (minute==minuteFloor+1 ? TIME_PICKER_INTERVAL : 0);
        if (minute==60)
            minute=0;
        mIgnoreEvent=true;
        view.setCurrentMinute(minute);
        mIgnoreEvent=false;
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然只能以五分钟的间隔选择分钟,但timepickerdialog看起来像:

小时和分钟

不知道会议记录如何显示5分钟的范围,如下图所示:

小时和分钟 -  5

我已搜索但无法找到解决方案.

Tan*_*dal 123

使用以下调用的自定义类CustomTimePickerDialog,我认为解决您的问题.

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import android.app.TimePickerDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.widget.NumberPicker;
import android.widget.TimePicker;

public class CustomTimePickerDialog extends TimePickerDialog {

    private final static int TIME_PICKER_INTERVAL = 5;
    private TimePicker mTimePicker;
    private final OnTimeSetListener mTimeSetListener;

    public CustomTimePickerDialog(Context context, OnTimeSetListener listener,
            int hourOfDay, int minute, boolean is24HourView) {
        super(context, TimePickerDialog.THEME_HOLO_LIGHT, null, hourOfDay,
                minute / TIME_PICKER_INTERVAL, is24HourView);
        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<>();
            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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是演示截图.

在此输入图像描述

  • NumberPicker不适用于预蜂窝.建议我解决这个问题 (5认同)
  • 好的,我设法通过添加onTimeChanged检查以及最后一次保存小时和分钟来解决30分钟的间隔.如果两者不同,则只使用`view.setCurrentHour(lastSavedHour)`来改变分钟而不是两者.我不确定这是否是一个好方法...但如果有更好的解决方案,请随时让我知道:) (4认同)
  • 我工作时间间隔为15分钟,但间隔时间不是30分钟 (2认同)
  • 我觉得这会在未来打破 - 谷歌正在限制通过反射访问内部结构:( (2认同)

luk*_*kle 17

有一个很棒的库MaterialDateTimePicker,可以创建漂亮的样式材料时间选择器.

您可以使用以下方法之一来定义间隔:

  • setSelectableTimes(Timepoint []次)您可以传入一个时间点数组.这些值是选择器中唯一有效的选择.setMinTime(Timepoint time)和setMaxTime(Timepoint time)将进一步修剪此列表.

  • setTimeInterval(int hourInterval,int minuteInterval,int secondInterval)设置TimePickerDialog中可选时间的间隔.这是setSelectableTimes的便利包装器


Rob*_*bin 7

正如@anddev84所说,您可以使用自己定制的TimePickerDialog来完成.

但是,看看你能找到的源代码:

  1. TimePickerDialog是一个框架布局,请参阅此文件.它只包含一个TimePicker
  2. TimePicker小部件只是一个线性布局,请参阅此文件.你可以看到分钟微调器是一个NumberPicker
  3. 参考NumberPicker的代码,你会发现它有一个公共方法setDisplayedValues(String [] displayedValues)

    /**
     * Sets the values to be displayed.
     *
     * @param displayedValues The displayed values.
     */
    public void setDisplayedValues(String[] displayedValues)
    
    Run Code Online (Sandbox Code Playgroud)

因此,有了这些信息,我想您可以在显示的有限时间内自定义您自己的时间选择器对话框.


小智 6

/**
 * Set TimePicker interval by adding a custom minutes list
 *
 * @param timePicker
 */
private void setTimePickerInterval(TimePicker timePicker) {
    try {

        NumberPicker minutePicker = (NumberPicker) timePicker.findViewById(Resources.getSystem().getIdentifier(
                "minute", "id", "android"));
        minutePicker.setMinValue(0);
        minutePicker.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));
        }
        minutePicker.setDisplayedValues(displayedValues.toArray(new String[0]));
    } catch (Exception e) {
        Log.e(TAG, "Exception: " + e);
    }
}
Run Code Online (Sandbox Code Playgroud)