Android學習筆記:設置日期和時間不能選擇當前時刻以前的日期時間的解決辦法

根據業務需求,需要實現如題的功能,細想一下,其中包含很多細節,如下:
1,如果設置年大於當前的年,那麼月,日,時間可以隨便設置;
2,如果設置年小於當前的年,那麼則設置不能成功;
3,如果設置年等於當前的年,那麼如果設置月大於當前的月,那麼日,時間可以隨便設置;
4,如果設置年等於當前的年,那麼如果設置月小於當前的月,那麼則設置不能成功;
5,如果設置年等於當前的年,那麼如果設置月等於當前的月,那麼如果設置日大於當前的日,則時間可以隨便設置;
。。。。。。
等等
在android中,關於日期和時間,我們首先想到的便是DatePicker和TimePicker兩個組件,接下來便是實現方式的問題,該如何實現呢?我本來設想的是用DatePickerDialog和TimePickerDialog,然後通過判斷來決定DatePicker中的按鈕是否可按,比如,設置年的值如果要小於當前的年的時候,則DatePicker中的“-”按鈕則是不可按的。這種方式實現起來比較的麻煩,而且源碼裡面有些東西也沒看懂,就自己做瞭個類似DatePickerDialog的組件,如下圖:

今日是6號,“-”按鈕是沒有反映的,點擊一下則變成瞭灰色,按照上面的業務一步一步的分析,則可以實現,不難,但是很煩瑣特別是佈局,最討厭的就是調整佈局,所以就把這些邏輯還是放到原有的DatePicker上來實現。當然實現的界面可能就沒有這麼直觀瞭。
 
                                         

 

                                          1                                                                                                                 2

  

                                                  3                                                                                                          4

  

                                                5                                                                                                             6

可能感覺有點坑爹,但是還是將就吧。
看看關鍵的代碼:
[java] 
@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; 

}
作者:duancanmeng 

發佈留言