android设置日期和时间的程序,Android:设置日期和时间不能选择当前时刻以前的日期时间的解决办法...

根据业务需求,需要实现如题的功能,细想一下,其中包含很多细节,如下:

1,如果设置年大于当前的年,那么月,日,时间可以随便设置;

2,如果设置年小于当前的年,那么则设置不能成功;

3,如果设置年等于当前的年,那么如果设置月大于当前的月,那么日,时间可以随便设置;

4,如果设置年等于当前的年,那么如果设置月小于当前的月,那么则设置不能成功;

5,如果设置年等于当前的年,那么如果设置月等于当前的月,那么如果设置日大于当前的日,则时间可以随便设置;

。。。。。。

等等

在android中,关于日期和时间,我们首先想到的便是DatePicker和TimePicker两个组件,接下来便是实现方式的问题,该如何实现呢?我本来设想的是用DatePickerDialog和TimePickerDialog,然后通过判断来决定DatePicker中的按钮是否可按,比如,设置年的值如果要小于当前的年的时候,则DatePicker中的“-”按钮则是不可按的。这种方式实现起来比较的麻烦,而且源码里面有些东西也没看懂,就自己做了个类似DatePickerDialog的组件,如下图:

0818b9ca8b590ca3270a3433284dd417.png

今日是6号,“-”按钮是没有反映的,点击一下则变成了灰色,按照上面的业务一步一步的分析,则可以实现,不难,但是很烦琐特别是布局,最讨厌的就是调整布局,所以就把这些逻辑还是放到原有的DatePicker上来实现。当然实现的界面可能就没有这么直观了。

0818b9ca8b590ca3270a3433284dd417.png  

0818b9ca8b590ca3270a3433284dd417.png

1                                                                                                                 2

0818b9ca8b590ca3270a3433284dd417.png  

0818b9ca8b590ca3270a3433284dd417.png

3                                                                                                          4

0818b9ca8b590ca3270a3433284dd417.png  

0818b9ca8b590ca3270a3433284dd417.png

5                                                                                                             6

0818b9ca8b590ca3270a3433284dd417.png

7

可能感觉有点坑爹,但是还是将就吧。

看看关键的代码:

@Override

protectedDialog onCreateDialog(intid) {

Dialog dialog =null;

switch(id) {

caseR.id.wait_edit_yuyuedata:

DatePickerDialog.OnDateSetListener dateListener =newDatePickerDialog.OnDateSetListener() {

@Override

publicvoidonDateSet(DatePicker datePicker,intyear,intmonth,intdayOfMonth) {

Log.i(TAG,"onDateSet----------->year:"+year+",month:"+(month+1)+",day:"+dayOfMonth);

if(year>getYear()){//设置年大于当前年,直接设置,不用判断下面的

wait_edit_yuyuedata.setText(dayOfMonth +"/"+(month+1)+"/"+year);

flag =1;

}elseif(year == getYear()){//设置年等于当前年,则向下开始判断月

if((month+1) > getMonth()){//设置月等于当前月,直接设置,不用判断下面的

flag =1;

wait_edit_yuyuedata.setText(dayOfMonth +"/"+(month+1)+"/"+year);

}elseif((month+1) == getMonth()){//设置月等于当前月,则向下开始判断日

if(dayOfMonth > getDay()){//设置日大于当前月,直接设置,不用判断下面的

flag =1;

wait_edit_yuyuedata.setText(dayOfMonth +"/"+(month+1)+"/"+year);

}elseif(dayOfMonth == getDay()){//设置日等于当前日,则向下开始判断时

flag =2;

wait_edit_yuyuedata.setText(dayOfMonth +"/"+(month+1)+"/"+year);

}else{//设置日小于当前日,提示重新设置

flag =3;

Toast.makeText(MainActivity.this,"当前日不能小于今日,请重新设置",2000).show();

}

}else{//设置月小于当前月,提示重新设置

flag =3;

Toast.makeText(MainActivity.this,"当前月不能小于今月,请重新设置",2000).show();

}

}else{//设置年小于当前年,提示重新设置

flag =3;

Toast.makeText(MainActivity.this,"当前年不能小于今年,请重新设置",2000).show();

}

if(flag ==3){

datePicker.init(getYear(), (getMonth()-1), getDay(),newDatePicker.OnDateChangedListener() {

@Override

publicvoidonDateChanged(DatePicker view,intyear,intmonthOfYear,

intdayOfMonth) {

wait_edit_yuyuedata.setText(dayOfMonth +"/"+(monthOfYear+1)+"/"+year);

}

});

}

}

};

dialog =newDatePickerDialog(this, dateListener, getYear(), (getMonth()-1), getDay());

break;

caseR.id.wait_edit_arriveltime:

TimePickerDialog.OnTimeSetListener timeListener =newTimePickerDialog.OnTimeSetListener() {

@Override

publicvoidonTimeSet(TimePicker view,inthourOfDay,intminute) {

Log.i(TAG,"onTimeSet----------->flag:"+flag+",hourOfDay:"+hourOfDay+",minute:"+minute);

switch(flag) {

case1://设置日期在当前日期之后,直接设置时间,不用判断

wait_edit_arriveltime.setText(hourOfDay+":"+minute);

break;

case2://设置日期等于当前日期之后,判断时和分

if(hourOfDay>getHonor()){

wait_edit_arriveltime.setText(hourOfDay+":"+minute);

}elseif(hourOfDay == getHonor()){

if(minute>getMin()){

wait_edit_arriveltime.setText(hourOfDay+":"+minute);

}else{

wait_edit_arriveltime.setText(getHonor()+":"+getMin());

Toast.makeText(MainActivity.this,"请选择大于现在时刻的分钟",2000).show();

}

}else{

wait_edit_arriveltime.setText(getHonor()+":"+getMin());

Toast.makeText(MainActivity.this,"请选择大于现在时刻的小时",2000).show();

}

break;

case3://设置日期等于当前日期之前,提示日期还未设置正确,不能设置时间

wait_edit_arriveltime.setText(getHonor()+":"+getMin());

Toast.makeText(MainActivity.this,"请先设置正确的日期",2000).show();

break;

default:

break;

}

}

};

Log.i(TAG,"init----------->flag:"+flag+",hourOfDay:"+getHonor()+",minute:"+getMin());

dialog =newTimePickerDialog(this, timeListener, getHonor(),getMin(),true);

break;

case1:

AlertDialog.Builder builder =newAlertDialog.Builder(MainActivity.this);

builder.setTitle("您要确定放弃编辑吗?");

builder.setPositiveButton("确定",newDialogInterface.OnClickListener() {

@Override

publicvoidonClick(DialogInterface arg0,intarg1) {

MainActivity.this.finish();

}});

builder.setNegativeButton("取消",newDialogInterface.OnClickListener() {

publicvoidonClick(DialogInterface dialog,intwhichButton) {

}

});

builder.show();

break;

default:

break;

}

returndialog;

}

@Override

protected Dialog onCreateDialog(int id) {

Dialog dialog = null;

switch (id) {

case R.id.wait_edit_yuyuedata:

DatePickerDialog.OnDateSetListener dateListener = new DatePickerDialog.OnDateSetListener() {

@Override

public void onDateSet(DatePicker datePicker,int year, int month, int dayOfMonth) {

Log.i(TAG,"onDateSet----------->year:"+year+",month:"+(month+1)+",day:"+dayOfMonth);

if(year>getYear()){//设置年大于当前年,直接设置,不用判断下面的

wait_edit_yuyuedata.setText(dayOfMonth + "/"+(month+1)+"/"+year);

flag = 1;

}else if(year == getYear()){//设置年等于当前年,则向下开始判断月

if((month+1) > getMonth()){//设置月等于当前月,直接设置,不用判断下面的

flag = 1;

wait_edit_yuyuedata.setText(dayOfMonth + "/"+(month+1)+"/"+year);

}else if((month+1) == getMonth()){//设置月等于当前月,则向下开始判断日

if(dayOfMonth > getDay()){//设置日大于当前月,直接设置,不用判断下面的

flag = 1;

wait_edit_yuyuedata.setText(dayOfMonth + "/"+(month+1)+"/"+year);

}else if(dayOfMonth == getDay()){//设置日等于当前日,则向下开始判断时

flag = 2;

wait_edit_yuyuedata.setText(dayOfMonth + "/"+(month+1)+"/"+year);

}else{//设置日小于当前日,提示重新设置

flag = 3;

Toast.makeText(MainActivity.this, "当前日不能小于今日,请重新设置", 2000).show();

}

}else{//设置月小于当前月,提示重新设置

flag = 3;

Toast.makeText(MainActivity.this, "当前月不能小于今月,请重新设置", 2000).show();

}

}else{//设置年小于当前年,提示重新设置

flag = 3;

Toast.makeText(MainActivity.this, "当前年不能小于今年,请重新设置", 2000).show();

}

if(flag == 3){

datePicker.init(getYear(), (getMonth()-1), getDay(), new DatePicker.OnDateChangedListener() {

@Override

public void onDateChanged(DatePicker view, int year, int monthOfYear,

int dayOfMonth) {

wait_edit_yuyuedata.setText(dayOfMonth + "/"+(monthOfYear+1)+"/"+year);

}

});

}

}

};

dialog = new DatePickerDialog(this, dateListener, getYear(), (getMonth()-1), getDay());

break;

case R.id.wait_edit_arriveltime:

TimePickerDialog.OnTimeSetListener timeListener = new TimePickerDialog.OnTimeSetListener() {

@Override

public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

Log.i(TAG,"onTimeSet----------->flag:"+flag+",hourOfDay:"+hourOfDay+",minute:"+minute);

switch (flag) {

case 1://设置日期在当前日期之后,直接设置时间,不用判断

wait_edit_arriveltime.setText(hourOfDay+":"+minute);

break;

case 2://设置日期等于当前日期之后,判断时和分

if(hourOfDay>getHonor()){

wait_edit_arriveltime.setText(hourOfDay+":"+minute);

}else if(hourOfDay == getHonor()){

if(minute>getMin()){

wait_edit_arriveltime.setText(hourOfDay+":"+minute);

}else{

wait_edit_arriveltime.setText(getHonor()+":"+getMin());

Toast.makeText(MainActivity.this, "请选择大于现在时刻的分钟", 2000).show();

}

}else{

wait_edit_arriveltime.setText(getHonor()+":"+getMin());

Toast.makeText(MainActivity.this, "请选择大于现在时刻的小时", 2000).show();

}

break;

case 3://设置日期等于当前日期之前,提示日期还未设置正确,不能设置时间

wait_edit_arriveltime.setText(getHonor()+":"+getMin());

Toast.makeText(MainActivity.this, "请先设置正确的日期", 2000).show();

break;

default:

break;

}

}

};

Log.i(TAG,"init----------->flag:"+flag+",hourOfDay:"+getHonor()+",minute:"+getMin());

dialog = new TimePickerDialog(this, timeListener, getHonor(),getMin(), true);

break;

case 1:

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

builder.setTitle("您要确定放弃编辑吗?");

builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface arg0, int arg1) {

MainActivity.this.finish();

}});

builder.setNegativeButton("取消",new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog,int whichButton) {

}

});

builder.show();

break;

default:

break;

}

return dialog;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值