利用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

相关文章
相关标签/搜索