控件说明:区间时间选择控件(仅支持时间的选择,日期默认为当天的系统日期),可以选择一个开始时间与结束时间。可以设置时间间隔(以分钟为单位)我demo中设置的为30min。控件有开始结束时间的选择联动,目前为如果选择了开始时间的话结束时间为开始时间的后一个。
废话不多说,效果图如下:
刚开始做的时候在网络找了下发现没有满足这个需求的控件,那就意味着需要自己动手啦(但是全部自己写的话代码量又会比较大),然后我发现了一个很优秀的时间选择控件原作者链接。此控件使用简单功能强大(换我的话是封装不了功能这么强大的控件的,向大佬致敬)。
1.添加引用
在app层的build.gradle dependencies中添加包的引用 “compile'org.jaaksi:pickerview:1.0.1'”
2.在Activity页面中的使用
1.声明弹窗对象
2.初始化弹窗并设置弹窗中的内容。
```
TimeSelectPicker mTimePicker =new TimeSelectPicker.Builder(MainActivity.this, TimeSelectPicker.TYPE_TIME, new TimeSelectPicker.OnTimeSelectListener() {
@Override
public void onTimeSelect(TimeSelectPicker picker, Date date, Date datestart) {
// Toast.makeText(MainActivity.this, picker.last + "", Toast.LENGTH_SHORT).show();
SimpleDateFormat format =new SimpleDateFormat("yyyy-MM-dd HH:mm");
String t1 = format.format(date);
String t2 = format.format(datestart);
Toast.makeText(MainActivity.this, t1 +"`"+t2, Toast.LENGTH_LONG).show();
}
})
// 设置不包含超出的结束时间<=
.setContainsEndDate(false)
.setTimeMinuteOffset(30)//设置时间列表显示的时间间隔
.setRangDate(System.currentTimeMillis(), 1577976666000L)
.create();//设置起始结束时间
Dialog pickerDialog = mTimePicker.getPickerDialog();
pickerDialog.setCanceledOnTouchOutside(true);
DefaultTopBar topBar = (DefaultTopBar) mTimePicker.getTopBar();
topBar.getTitleView().setText("请选择时间");//设置弹窗的标题
pickerDialog.show();
```
使用说明:TimeSelectPicker类为我自己定义的弹窗控件类,继承自BasePicker类 是直接参考MixedTimePicker类中的代码来做的修改,感兴趣的可以看一下这个类里的源码。我这里70%跟该类代码是相同的,为了满足我的需求个别地方我做了些修改。MixedTimePicker类中实现了日期和时间的联动选择,由于我这里不需要考虑日期就在修改时将日期部分去掉了替换为了开始时间的内容。
3.修改思路
由于原demo本身是有时间和日期选择的,所以这个就直接将控件复制来了一份在之前的基础上将显示的日期那部分替换为了这里的开始时间(返回日期的话目前是直接写死为系统时间当天的日期),由于之前控件的Item选择事件是直接写到一起的,应为之前处理的是时间与日期可以通过类型来判断是要刷新时间还是刷新日期。但是我这里就不行了 ,因为两个都是日期没办法判断需要去刷新哪一个。所以我直接将他们的选择监听事件分开来写了,在开始选择中处理选中后页面刷新和结束时间页面的数据联动。在结束选中监听中处理了结束时间的页面数据刷新。这样的话数据就不会乱掉了。
```
//开始时间选择监听
mTimePicker.setOnSelectedListener(new BasePickerView.OnSelectedListener() {
@Override
public void onSelected(BasePickerView pickerView, int position) {//结束时间选择监听
last =mTimePicker.getSelectedItem() *mTimeMinuteOffset;
mTimePicker.setSelectedPosition(findPositionByValidTimes(last), false);
//获取选中的时间
Calendar selectCalendar = Calendar.getInstance();
selectCalendar.setTimeInMillis(getSelectedDates().getTime());
//判断是否需要联动结束时间
if (selectCalendar.getTime().getTime() >mStartDate.getTime().getTime()) {
last1 = (mTimePicker.getSelectedItem() +1) *mTimeMinuteOffset;//在开始时间的基础上+1
mDatePicker.setSelectedPosition(findPositionByValidTimes1(last1), false);
}
}
});
```
开始时间选择后的监听
```
//结束时间选择监听
mDatePicker.setOnSelectedListener(new BasePickerView.OnSelectedListener() {
@Override
public void onSelected(BasePickerView pickerView, int position) {//开始时间选择监听
//设置选中的结束时间位置
last1 =mDatePicker.getSelectedItem() *mTimeMinuteOffset;
// adapter 的item设置的是 有效分钟数/mTimeMinuteOffset 结束时间
mDatePicker.setAdapter(
new NumericWheelAdapter(getValidTimesValue(start1), getValidTimesValue(end1)));
mDatePicker.setSelectedPosition(findPositionByValidTimes1(last1), false);
Toast.makeText(mContext, "选中了" + position, Toast.LENGTH_SHORT).show();
}
});
```
结束时间选择监听
到这里基本上就结束啦,怕自己忘记写个博客记录一下。在这里github链接也贴一下。