利用Android TimePicker 和 DatePicker 實現對時間的限制

最近項目裏須要對時間限制的時間選擇器,固然實現這種功能徹底能夠自定義一個,網上也有不少自定義的 時間選擇器,在原來的基礎上根據本身的須要修改一下就能夠了。我才用了android 自帶的TimePicker,和 DatePicker 以及 dialog;html

先來看看原理:java

       1, DatePicker :    android

                DatePicker 相對 TimePicker 還好點, 由於它自帶了  setMinDate()和setMaxDate()兩個方法, 咱們直接就能夠經過這兩個方法對datepicker進行範圍的設定:google

Calendar minCalendar = Calendar.getInstance();
		
		minCalendar.set(Calendar.DAY_OF_MONTH, minCalendar.get(Calendar.DAY_OF_MONTH)+delayDays);
		datePicker.setMinDate(minCalendar.getTimeInMillis());//添加範圍的最小值

		Calendar maxCalendar = Calendar.getInstance();
		maxCalendar.add(Calendar.YEAR, 2);//設置年的範圍(今年是2016,第二個參數是2則,datepicker範圍爲2016-2018)
		datePicker.setMaxDate(maxCalendar.getTimeInMillis());//添加範圍的最小值

		Calendar curCalendar = Calendar.getInstance();
		datePicker.init(curCalendar.get(Calendar.YEAR),
				curCalendar.get(Calendar.MONTH),
				curCalendar.get(Calendar.DAY_OF_MONTH), null);

 

 

2,Timepicker:.net

        timepicker 相對於 datepicker 來講就難搞一點,由於它對應的類中功能至關無力;因此在作這個功能的時候datepicker解決後,卡在timepicker這一天;後來總結下來,不得不認可本身的java基礎實在是太差;由於在這裏咱們要用到的一個知識點是:反射。code

    咱們來看一看google源碼的內容:htm

            a, 先看一下 datepicker 裏面的:對象

                    

在DatePicker類裏定義了這三個屬性,咱們能夠猜到datepicker裏的數據顯示就是這三個NumberPicker對象的屬性實現的功能;get

                         在datepicker裏的setMinDate()和setMaxDate()使用了numberPicker類中的setMinValue和setMaxValue()方法;至此,我想思路也差很少了源碼

 

 

            b,而後看看 timepicker 裏面的:

                        

                           同樣的類型,那麼只要咱們能得到 NumberPicker 的兩個對象:mHourSpinner 和 mMinuteSpinner , 就能夠對Timepicker 進行時間範圍的設定了:

try {//反射
			Field hourSpinnerField = timePicker.getClass().getDeclaredField("mHourSpinner");
			hourSpinnerField.setAccessible(true);
			NumberPicker hourSpinner = (NumberPicker) hourSpinnerField.get(timePicker);
			hourSpinner.setMinValue(minHour);
			hourSpinner.setMaxValue(maxHour);
		} catch (Exception e) {
			e.printStackTrace();
		}

 

 

==========================  我是分割線 ======================

由於API21之後的TimePicker類有所改變,因此再用以上反射方法是獲取不到mHourSpinner,和mMinuteSpinner的。因此在Android L 或以後版本的手機是設置不了時間範圍的。因此該怎麼辦,沒辦法,最好自定義一個好了。百度了一下,有位網友自定義了一個PickerView,在這基礎上,我又作了些改動。能夠根據當前時間動態設置可選時間範圍。

具體源碼以下地址:

    http://download.csdn.net/detail/qq_33363534/9591234

 

 

   是的,就這麼簡單,然而折磨了我一天多。然而我本身仍是太水;

 

    感謝這位仁兄:http://www.bkjia.com/Androidjc/884699.html

    另附上demo 下載地址:   http://download.csdn.net/detail/qq_33363534/9543855

相關文章
相關標籤/搜索