最近項目裏須要對時間限制的時間選擇器,固然實現這種功能徹底能夠自定義一個,網上也有不少自定義的 時間選擇器,在原來的基礎上根據本身的須要修改一下就能夠了。我才用了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