预约时间
需求:把可选范围定在 当前时间往后8小时 到 7天后的时间 精确到分
用到了 datepickerdialog 和 自定义的Timepickerdialog
没有直接自定义控件 把两者结合到一个视图上去
在限定时间范围的时候
日期是好控制的
datepickerdialog 可以直接获得datepicker
通过datepicker来 setMinDate 和 setMaxDate
但是Timepickerdialog就难弄了,里面没有可以直接设置的方法
所以这里就要自定义TimePickerDialog了
public class RangeTimePickerDialog extends TimePickerDialog {
private int minHour = -1;
private int minMinute = -1;
private int maxHour = 25;
private int maxMinute = 25;
private int currentHour = 0;
private int currentMinute = 0;
private Calendar calendar = Calendar.getInstance();
private DateFormat dateFormat;
public RangeTimePickerDialog(Context context, OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView) {
super(context, callBack, hourOfDay, minute, is24HourView);
currentHour = hourOfDay;
currentMinute = minute;
dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT);
try {
Class<?> superclass = getClass().getSuperclass();
Field mTimePickerField = superclass.getDeclaredField("mTimePicker");
mTimePickerField.setAccessible(true);
TimePicker mTimePicker = (TimePicker) mTimePickerField.get(this);
mTimePicker.setOnTimeChangedListener(this);
} catch (NoSuchFieldException e) {
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
}
}
public RangeTimePickerDialog(Context context,
int theme,
OnTimeSetListener callBack,
int hourOfDay, int minute, boolean is24HourView) {
super(context, theme,callBack, hourOfDay, minute, is24HourView);
currentHour = hourOfDay;
currentMinute = minute;
dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT);
try {
Class<?> superclass = getClass().getSuperclass();
Field mTimePickerField = superclass.getDeclaredField("mTimePicker");
mTimePickerField.setAccessible(true);
TimePicker mTimePicker = (TimePicker) mTimePickerField.get(this);
mTimePicker.setOnTimeChangedListener(this);
} catch (NoSuchFieldException e) {
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
}
}
public void setMin(int hour, int minute) {
minHour = hour;
minMinute = minute;
}
public void setMax(int hour, int minute) {
maxHour = hour;
maxMinute = minute;
}
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
boolean validTime = true;
if (hourOfDay < minHour || (hourOfDay == minHour && minute < minMinute)){
validTime = false;
}
if (hourOfDay > maxHour || (hourOfDay == maxHour && minute > maxMinute)){
validTime = false;
}
if (validTime) {
currentHour = hourOfDay;
currentMinute = minute;
}
updateTime(currentHour, currentMinute);
updateDialogTitle(view, currentHour, currentMinute);
}
private void updateDialogTitle(TimePicker timePicker, int hourOfDay, int minute) {
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
calendar.set(Calendar.MINUTE, minute);
String title = dateFormat.format(calendar.getTime());
setTitle(title);
}
}
通过这段代码 我们就可以设置 一个 min 和一个max了
剩下的就只是逻辑判断了
//创建DatePickerDialog对象
DatePickerDialog dpd = new DatePickerDialog(HomeRepairAddActivity.this,AlertDialog.THEME_HOLO_LIGHT,Datelistener,year,month,day);
DatePicker dp = dpd.getDatePicker();
System.out.println("当前是:"+year+"年"+month+"月"+day+"日"+hour+"时"+min+"分");
//通过判断hour+8小时后是否大于24来限定可选天数
if(hour+8>=24)
{
//说明八小时后是第二天了,设置可选天数从第二天开始
int newday = 1*24*60*60*1000;
dp.setMinDate(mydate.getTime()+newday);
}else
{
//没大于24小时,说明还是当天
dp.setMinDate(mydate.getTime());
}
int newday = 7*24*60*60*1000;
dp.setMaxDate(mydate.getTime()+newday);
long se = mydate.getTime()+newday;
dpd.setTitle("请设置报修日期");
dpd.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
RangeTimePickerDialog tpd = new RangeTimePickerDialog(HomeRepairAddActivity.this,AlertDialog.THEME_HOLO_LIGHT, timelistener, FixedHour, min, true);
tpd.setTitle("请设置预约报修时间");
if(month>FixedMonth)
{
//如果选中的月份大于当前月份,就拿到当月最大天数
int Maxday= mycalendar.getActualMaximum(Calendar.DATE);
day = day+Maxday;
is=true;
}
System.out.println(day-FixedDay);
if(day-FixedDay==7)
{
//说明是7天之后,是最大的预约时间, 设置 最大时间 为 当前时间
tpd.setMax(hour, min);
}else if(day-FixedDay<6 && day-FixedDay>1)
{
//说明是 在7天以内 可以让用户随意设置时间
System.out.println("走这了");
}
else
{
//说明是当天 判断+8小时是否超过24小时
if(hour+8>=24)
{
//超过了
//判断新的小时是否大于当前小时
int newHour = hour-16;
if(newHour>FixedHour-16)
{
//超过了 分钟可以任意设置 小时下线限定为新的小时
tpd.setMin(newHour, 60);
tpd.setMax(24, 60);
}else
{
//没超过 分钟的下线就是当前的分钟
tpd.setMin(newHour, min);
}
}else
{
//没超过 就不让用户选择当前时间之前的时间了
tpd.setMin(hour, min);
}
}
tpd.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
if(is)
{
Calendar calendar=Calendar.getInstance(Locale.CHINA);
int Mday= calendar.getActualMaximum(Calendar.DATE);
day = day-Mday;
//设置文本框时间
addtime.setText(year + "年" + (month + 1) + "月" + day+"日 "+hour+":"+min);
}
String Time_date = year+"-"+(month + 1)+"-"+day+" "+hour+":"+min;
try {
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(Time_date);
scheduledTime = date.getTime();
} catch (Exception e) {
e.printStackTrace();
}
is=false;
}
});
tpd.show();
}
});
dpd.show();//显示DatePickerDialog组件
}
});
}
private TimePickerDialog.OnTimeSetListener timelistener = new OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
hour = hourOfDay;
min = minute;
addtime.setText(year + "年" + (month + 1) + "月" + day+"日 "+hour+":"+min);
}
};
private DatePickerDialog.OnDateSetListener Datelistener = new DatePickerDialog.OnDateSetListener() {
/**
* params:view:该事件关联的组件 params:myyear:当前选择的年 params:monthOfYear:当前选择的月
* params:dayOfMonth:当前选择的日
*/
@Override
public void onDateSet(DatePicker view, int myyear, int monthOfYear,
int dayOfMonth) {
// 修改year、month、day的变量值,以便以后单击按钮时,DatePickerDialog上显示上一次修改后的值
year = myyear;
month = monthOfYear;
day = dayOfMonth;
}
};