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

 预约时间

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

};




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值