当前位置:   article > 正文

Android:设置日期和时间不能选择当前时刻以前的日期时间的解决办法_android 自定义日期 过去时间不可选

android 自定义日期 过去时间不可选

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

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

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

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

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

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

。。。。。。

等等

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

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

  

                                          1                                                                                                                 2

  

                                                  3                                                                                                          4

  

                                                5                                                                                                             6


                                                     7


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

看看关键的代码:

  1. @Override  
  2. protected Dialog onCreateDialog(int id) {  
  3.     Dialog dialog = null;  
  4.     switch (id) {  
  5.     case R.id.wait_edit_yuyuedata:  
  6.          DatePickerDialog.OnDateSetListener dateListener = new DatePickerDialog.OnDateSetListener() {   
  7.                 @Override   
  8.                 public void onDateSet(DatePicker datePicker,int year, int month, int dayOfMonth) {   
  9.                  Log.i(TAG,"onDateSet----------->year:"+year+",month:"+(month+1)+",day:"+dayOfMonth);  
  10.                  if(year>getYear()){ //设置年大于当前年,直接设置,不用判断下面的   
  11.                      wait_edit_yuyuedata.setText(dayOfMonth + "/"+(month+1)+"/"+year);  
  12.                      flag = 1;  
  13.                  }else if(year == getYear()){   //设置年等于当前年,则向下开始判断月   
  14.                      if((month+1) > getMonth()){ //设置月等于当前月,直接设置,不用判断下面的   
  15.                          flag = 1;  
  16.                          wait_edit_yuyuedata.setText(dayOfMonth + "/"+(month+1)+"/"+year);  
  17.                      }else if((month+1) == getMonth()){     //设置月等于当前月,则向下开始判断日   
  18.                          if(dayOfMonth > getDay()){          //设置日大于当前月,直接设置,不用判断下面的   
  19.                              flag = 1;  
  20.                              wait_edit_yuyuedata.setText(dayOfMonth + "/"+(month+1)+"/"+year);  
  21.                          }else if(dayOfMonth == getDay()){  //设置日等于当前日,则向下开始判断时   
  22.                              flag = 2;  
  23.                              wait_edit_yuyuedata.setText(dayOfMonth + "/"+(month+1)+"/"+year);  
  24.                          }else{     //设置日小于当前日,提示重新设置   
  25.                              flag = 3;  
  26.                              Toast.makeText(MainActivity.this"当前日不能小于今日,请重新设置"2000).show();  
  27.                          }  
  28.                      }else{         //设置月小于当前月,提示重新设置   
  29.                          flag = 3;  
  30.                          Toast.makeText(MainActivity.this"当前月不能小于今月,请重新设置"2000).show();  
  31.                      }  
  32.                  }else{             //设置年小于当前年,提示重新设置   
  33.                      flag = 3;  
  34.                      Toast.makeText(MainActivity.this"当前年不能小于今年,请重新设置"2000).show();  
  35.                  }  
  36.                    
  37.                  if(flag == 3){  
  38.                      datePicker.init(getYear(), (getMonth()-1), getDay(), new DatePicker.OnDateChangedListener() {  
  39.                               
  40.                             @Override  
  41.                             public void onDateChanged(DatePicker view, int year, int monthOfYear,  
  42.                                     int dayOfMonth) {  
  43.                                 wait_edit_yuyuedata.setText(dayOfMonth + "/"+(monthOfYear+1)+"/"+year);  
  44.                             }  
  45.                         });  
  46.                  }  
  47.                 }   
  48.             };   
  49.          dialog = new DatePickerDialog(this, dateListener, getYear(), (getMonth()-1), getDay());   
  50.             break;  
  51.     case R.id.wait_edit_arriveltime:  
  52.         TimePickerDialog.OnTimeSetListener timeListener = new TimePickerDialog.OnTimeSetListener() {  
  53.               
  54.             @Override  
  55.             public void onTimeSet(TimePicker view, int hourOfDay, int minute) {  
  56.                 Log.i(TAG,"onTimeSet----------->flag:"+flag+",hourOfDay:"+hourOfDay+",minute:"+minute);  
  57.                 switch (flag) {  
  58.                 case 1:         //设置日期在当前日期之后,直接设置时间,不用判断   
  59.                     wait_edit_arriveltime.setText(hourOfDay+":"+minute);  
  60.                     break;  
  61.                 case 2:         //设置日期等于当前日期之后,判断时和分   
  62.                     if(hourOfDay>getHonor()){  
  63.                         wait_edit_arriveltime.setText(hourOfDay+":"+minute);  
  64.                     }else if(hourOfDay == getHonor()){  
  65.                         if(minute>getMin()){  
  66.                             wait_edit_arriveltime.setText(hourOfDay+":"+minute);  
  67.                         }else{  
  68.                             wait_edit_arriveltime.setText(getHonor()+":"+getMin());  
  69.                             Toast.makeText(MainActivity.this"请选择大于现在时刻的分钟"2000).show();  
  70.                         }  
  71.                     }else{  
  72.                         wait_edit_arriveltime.setText(getHonor()+":"+getMin());  
  73.                         Toast.makeText(MainActivity.this"请选择大于现在时刻的小时"2000).show();  
  74.                     }  
  75.                     break;  
  76.                 case 3:         //设置日期等于当前日期之前,提示日期还未设置正确,不能设置时间   
  77.                     wait_edit_arriveltime.setText(getHonor()+":"+getMin());  
  78.                     Toast.makeText(MainActivity.this"请先设置正确的日期"2000).show();  
  79.                     break;  
  80.                   
  81.                 default:  
  82.                     break;  
  83.                 }  
  84.             }  
  85.         };  
  86.         Log.i(TAG,"init----------->flag:"+flag+",hourOfDay:"+getHonor()+",minute:"+getMin());  
  87.         dialog = new TimePickerDialog(this, timeListener, getHonor(),getMin(), true);  
  88.         break;  
  89.     case 1:  
  90.         AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);  
  91.         builder.setTitle("您要确定放弃编辑吗?");  
  92.         builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {  
  93.   
  94.             @Override  
  95.             public void onClick(DialogInterface arg0, int arg1) {  
  96.                 MainActivity.this.finish();  
  97.             }});  
  98.         builder.setNegativeButton("取消",new DialogInterface.OnClickListener() {  
  99.               
  100.             public void onClick(DialogInterface dialog,int whichButton) {  
  101.   
  102.             }  
  103.         });  
  104.         builder.show();  
  105.         break;  
  106.     default:  
  107.         break;  
  108.     }  
  109.     return dialog;  
  110. }  
  1. @Override
  2. protected Dialog onCreateDialog(int id) {
  3. Dialog dialog = null;
  4. switch (id) {
  5. case R.id.wait_edit_yuyuedata:
  6. DatePickerDialog.OnDateSetListener dateListener = new DatePickerDialog.OnDateSetListener() {
  7. @Override
  8. public void onDateSet(DatePicker datePicker,int year, int month, int dayOfMonth) {
  9. Log.i(TAG,"onDateSet----------->year:"+year+",month:"+(month+1)+",day:"+dayOfMonth);
  10. if(year>getYear()){ //设置年大于当前年,直接设置,不用判断下面的
  11. wait_edit_yuyuedata.setText(dayOfMonth + "/"+(month+1)+"/"+year);
  12. flag = 1;
  13. }else if(year == getYear()){ //设置年等于当前年,则向下开始判断月
  14. if((month+1) > getMonth()){ //设置月等于当前月,直接设置,不用判断下面的
  15. flag = 1;
  16. wait_edit_yuyuedata.setText(dayOfMonth + "/"+(month+1)+"/"+year);
  17. }else if((month+1) == getMonth()){ //设置月等于当前月,则向下开始判断日
  18. if(dayOfMonth > getDay()){ //设置日大于当前月,直接设置,不用判断下面的
  19. flag = 1;
  20. wait_edit_yuyuedata.setText(dayOfMonth + "/"+(month+1)+"/"+year);
  21. }else if(dayOfMonth == getDay()){ //设置日等于当前日,则向下开始判断时
  22. flag = 2;
  23. wait_edit_yuyuedata.setText(dayOfMonth + "/"+(month+1)+"/"+year);
  24. }else{ //设置日小于当前日,提示重新设置
  25. flag = 3;
  26. Toast.makeText(MainActivity.this, "当前日不能小于今日,请重新设置", 2000).show();
  27. }
  28. }else{ //设置月小于当前月,提示重新设置
  29. flag = 3;
  30. Toast.makeText(MainActivity.this, "当前月不能小于今月,请重新设置", 2000).show();
  31. }
  32. }else{ //设置年小于当前年,提示重新设置
  33. flag = 3;
  34. Toast.makeText(MainActivity.this, "当前年不能小于今年,请重新设置", 2000).show();
  35. }
  36. if(flag == 3){
  37. datePicker.init(getYear(), (getMonth()-1), getDay(), new DatePicker.OnDateChangedListener() {
  38. @Override
  39. public void onDateChanged(DatePicker view, int year, int monthOfYear,
  40. int dayOfMonth) {
  41. wait_edit_yuyuedata.setText(dayOfMonth + "/"+(monthOfYear+1)+"/"+year);
  42. }
  43. });
  44. }
  45. }
  46. };
  47. dialog = new DatePickerDialog(this, dateListener, getYear(), (getMonth()-1), getDay());
  48. break;
  49. case R.id.wait_edit_arriveltime:
  50. TimePickerDialog.OnTimeSetListener timeListener = new TimePickerDialog.OnTimeSetListener() {
  51. @Override
  52. public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
  53. Log.i(TAG,"onTimeSet----------->flag:"+flag+",hourOfDay:"+hourOfDay+",minute:"+minute);
  54. switch (flag) {
  55. case 1: //设置日期在当前日期之后,直接设置时间,不用判断
  56. wait_edit_arriveltime.setText(hourOfDay+":"+minute);
  57. break;
  58. case 2: //设置日期等于当前日期之后,判断时和分
  59. if(hourOfDay>getHonor()){
  60. wait_edit_arriveltime.setText(hourOfDay+":"+minute);
  61. }else if(hourOfDay == getHonor()){
  62. if(minute>getMin()){
  63. wait_edit_arriveltime.setText(hourOfDay+":"+minute);
  64. }else{
  65. wait_edit_arriveltime.setText(getHonor()+":"+getMin());
  66. Toast.makeText(MainActivity.this, "请选择大于现在时刻的分钟", 2000).show();
  67. }
  68. }else{
  69. wait_edit_arriveltime.setText(getHonor()+":"+getMin());
  70. Toast.makeText(MainActivity.this, "请选择大于现在时刻的小时", 2000).show();
  71. }
  72. break;
  73. case 3: //设置日期等于当前日期之前,提示日期还未设置正确,不能设置时间
  74. wait_edit_arriveltime.setText(getHonor()+":"+getMin());
  75. Toast.makeText(MainActivity.this, "请先设置正确的日期", 2000).show();
  76. break;
  77. default:
  78. break;
  79. }
  80. }
  81. };
  82. Log.i(TAG,"init----------->flag:"+flag+",hourOfDay:"+getHonor()+",minute:"+getMin());
  83. dialog = new TimePickerDialog(this, timeListener, getHonor(),getMin(), true);
  84. break;
  85. case 1:
  86. AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
  87. builder.setTitle("您要确定放弃编辑吗?");
  88. builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {
  89. @Override
  90. public void onClick(DialogInterface arg0, int arg1) {
  91. MainActivity.this.finish();
  92. }});
  93. builder.setNegativeButton("取消",new DialogInterface.OnClickListener() {
  94. public void onClick(DialogInterface dialog,int whichButton) {
  95. }
  96. });
  97. builder.show();
  98. break;
  99. default:
  100. break;
  101. }
  102. return dialog;
  103. }


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/594095
推荐阅读
相关标签
  

闽ICP备14008679号