当前位置: 代码迷 >> Android >> Android学习笔记:设置日期和时间不能选择当前时刻以前的日期时间的解决方法
  详细解决方案

Android学习笔记:设置日期和时间不能选择当前时刻以前的日期时间的解决方法

热度:28   发布时间:2016-05-01 17:41:02.0
Android学习笔记:设置日期和时间不能选择当前时刻以前的日期时间的解决办法

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

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

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

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

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

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

。。。。。。

等等

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

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

  

                                          1                                                                                                                 2

  

                                                  3                                                                                                          4

  

                                                5                                                                                                             6


                                                     7


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

看看关键的代码:

 @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;	}

具体的代码,请点击下载:1:http://download.csdn.net/detail/duancanmeng/4480117  2:http://download.csdn.net/detail/duancanmeng/4480126

  相关解决方案