您的位置:首页 > 其它

一段datepickerdialog与自定义Timepickerdialog限定时间范围的逻辑

2015-08-25 23:26 417 查看


预约时间

需求:把可选范围定在 当前时间往后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;

}

};




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: