https://github.com/JZXiang/TimePickerDialog
An Android time picker library.
Easy to use.
Support five types.
Able to set the minimun and maximum millseconds.
gradle, latest version:
compile 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
Demo picture
An example configuration
mDialogAll = new TimePickerDialog.Builder()
.setCallBack(this)
.setCancelStringId("Cancel")
.setSureStringId("Sure")
.setTitleStringId("TimePicker")
.setYearText("Year")
.setMonthText("Month")
.setDayText("Day")
.setHourText("Hour")
.setMinuteText("Minute")
.setCyclic(false)
.setMinMillseconds(System.currentTimeMillis())
.setMaxMillseconds(System.currentTimeMillis() + tenYears)
.setCurrentMillseconds(System.currentTimeMillis())
.setThemeColor(getResources().getColor(R.color.timepicker_dialog_bg))
.setType(Type.ALL)
.setWheelItemTextNormalColor(getResources().getColor(R.color.timetimepicker_default_text_color))
.setWheelItemTextSelectorColor(getResources().getColor(R.color.timepicker_toolbar_bg))
.setWheelItemTextSize(12)
.build();
2.
https://github.com/Bigkoo/Android-PickerView
这是一款仿iOS的PickerView控件,有时间选择和选项选择,并支持一二三级联动,支持自定义样式,3.x新版本的详细特性如下:
- 有时间和选项这两种选择器
- 选项选择器支持三级联动
- 时间选择器支持起始和终止日期设定
- 支持“年,月,日,时,分,秒”,“省,市,区”等选项的单位(label)显示、隐藏和自定义。
- 支持自定义文字、颜色、文字大小等属性
- 支持背景颜色更换,有夜间模式需求的问题可以解决了
- Item的文字长度过长时,文字会自适应缩放到Item的长度,避免显示不完全的问题
——TimePickerView 时间选择器,支持年月日时分,年月日,年月,时分等格式
——OptionsPickerView 选项选择器,支持一,二,三级选项选择,并且可以设置是否联动
有兴趣研究3D滚轮效果的实现机制,希望把源码研究透彻的可以看看这篇博客:
Android-PickerView系列之源码解析篇(二)
V3.2.5版本更新说明(2017-5-15)
- 优化:年月日时分秒 从枚举类型改为boolean 数组,分别控制它们的显示与否。
- 新增:setBackgroundId方法,原本是默认灰色,新增此方法,可根据实际需求自由定制背景遮罩颜色。
- 新增:setDecorView方法,可自由设置pickview的容器,即控件显示在哪个控件里面。
- 新增:show方法添加isAnim参数,控制是否显示动画效果。
V3.2.4版本更新说明(2017-4-7)
- 修复:修复偶尔会出现item滑到第一项或最后一项时滑出边界的情况 。
V3.2.3版本更新说明(2017-3-31)
- 优化:滚轮边界处理优化,解决滑动到第一项或最后一项时会跳动的情况。
- 优化:Dialog 模式 下PickerView的弹出和关闭添加了缩放动画,优化视觉效果。
V3.2.2版本更新说明(2017-3-24)
- 新增:isCenterLabel(boolean isCenter)方法,该方法默认为true,只在选中项显示label;填false 则每项item后面都会带有label。
V3.2.1版本更新说明(2017-3-23)
- 新增:show(View v) 方法,用于绑定所点击弹出 picker 的 View 控件。
- 废弃:optionsPicker 的 setLinkage 方法。
- 新增:optionsPicker 的 setNPicker 方法,用于多级不联动情况下,条件选择器的显示。
- 修复:在某些极端情况下,快速滑动并还未停止时就点击确定按钮,导致数据匹配不当造成应用崩溃的问题。
更多历史版本详情,请查阅:更新说明(3.x版本)
方法名与参数请查阅:方法名与参数说明文档
使用步骤:
1.添加Jcenter仓库 Gradle依赖:
compile 'com.contrarywind:Android-PickerView:3.2.5'
或者
Maven
<dependency>
<groupId>com.contrarywind</groupId>
<artifactId>Android-PickerView</artifactId>
<version>3.2.5</version>
<type>pom</type>
</dependency>
2.在Activity中添加如下代码:
//时间选择器
TimePickerView pvTime = new TimePickerView.Builder(this, new TimePickerView.OnTimeSelectListener() {
@Override
public void onTimeSelect(Date date,View v) {//选中事件回调
tvTime.setText(getTime(date));
}
})
.build();
pvTime.setDate(Calendar.getInstance());//注:根据需求来决定是否使用该方法(一般是精确到秒的情况),此项可以在弹出选择器的时候重新设置当前时间,避免在初始化之后由于时间已经设定,导致选中时间与当前时间不匹配的问题。
pvTime.show();
//条件选择器
OptionsPickerView pvOptions = new OptionsPickerView.Builder(this, new OptionsPickerView.OnOptionsSelectListener() {
@Override
public void onOptionsSelect(int options1, int option2, int options3 ,View v) {
//返回的分别是三个级别的选中位置
String tx = options1Items.get(options1).getPickerViewText()
+ options2Items.get(options1).get(option2)
+ options3Items.get(options1).get(option2).get(options3).getPickerViewText();
tvOptions.setText(tx);
}
}).build();
pvOptions.setPicker(options1Items, options2Items, options3Items);
pvOptions.show();
大功告成~
3.如果默认样式不符合你的口味,可以自定义各种属性:
Calendar selectedDate = Calendar.getInstance();
Calendar startDate = Calendar.getInstance();
startDate.set(2013,1,1);
Calendar endDate = Calendar.getInstance();
endDate.set(2020,1,1);
pvTime = new TimePickerView.Builder(this, new TimePickerView.OnTimeSelectListener() {
@Override
public void onTimeSelect(Date date,View v) {//选中事件回调
tvTime.setText(getTime(date));
}
})
.setType(TimePickerView.Type.ALL)//默认全部显示
.setCancelText("Cancel")//取消按钮文字
.setSubmitText("Sure")//确认按钮文字
.setContentSize(18)//滚轮文字大小
.setTitleSize(20)//标题文字大小
.setTitleText("Title")//标题文字
.setOutSideCancelable(false)//点击屏幕,点在控件外部范围时,是否取消显示
.isCyclic(true)//是否循环滚动
.setTitleColor(Color.BLACK)//标题文字颜色
.setSubmitColor(Color.BLUE)//确定按钮文字颜色
.setCancelColor(Color.BLUE)//取消按钮文字颜色
.setTitleBgColor(0xFF666666)//标题背景颜色 Night mode
.setBgColor(0xFF333333)//滚轮背景颜色 Night mode
.setDate(selectedDate)// 如果不设置的话,默认是系统时间*/
.setRangDate(startDate,endDate)//起始终止年月日设定
.setLabel("年","月","日","时","分","秒")
.isCenterLabel(false) //是否只显示中间选中项的label文字,false则每项item全部都带有label。
.isDialog(true)//是否显示为对话框样式
.build();
pvOptions = new OptionsPickerView.Builder(this, new OptionsPickerView.OnOptionsSelectListener() {
@Override
public void onOptionsSelect(int options1, int option2, int options3 ,View v) {
//返回的分别是三个级别的选中位置
String tx = options1Items.get(options1).getPickerViewText()
+ options2Items.get(options1).get(option2)
+ options3Items.get(options1).get(option2).get(options3).getPickerViewText();
tvOptions.setText(tx);
}
})
.setSubmitText("确定")//确定按钮文字
.setCancelText("取消")//取消按钮文字
.setTitleText("城市选择")//标题
.setSubCalSize(18)//确定和取消文字大小
.setTitleSize(20)//标题文字大小
.setTitleColor(Color.BLACK)//标题文字颜色
.setSubmitColor(Color.BLUE)//确定按钮文字颜色
.setCancelColor(Color.BLUE)//取消按钮文字颜色
.setTitleBgColor(0xFF333333)//标题背景颜色 Night mode
.setBgColor(0xFF000000)//滚轮背景颜色 Night mode
.setContentTextSize(18)//滚轮文字大小
.setLinkage(false)//设置是否联动,默认true
.setLabels("省", "市", "区")//设置选择的三级单位
.isCenterLabel(false) //是否只显示中间选中项的label文字,false则每项item全部都带有label。
.setCyclic(false, false, false)//循环与否
.setSelectOptions(1, 1, 1) //设置默认选中项
.setOutSideCancelable(false)//点击外部dismiss default true
.isDialog(true)//是否显示为对话框样式
.build();
pvOptions.setPicker(options1Items, options2Items, options3Items);//添加数据源
4.如果需要自定义布局:
// 注意:自定义布局中,id为 optionspicker 或者 timepicker 的布局以及其子控件必须要有,否则会报空指针
// 具体可参考demo 里面的两个自定义布局
pvCustomOptions = new OptionsPickerView.Builder(this, new OptionsPickerView.OnOptionsSelectListener() {
@Override
public void onOptionsSelect(int options1, int option2, int options3, View v) {
//返回的分别是三个级别的选中位置
String tx = cardItem.get(options1).getPickerViewText();
btn_CustomOptions.setText(tx);
}
})
.setLayoutRes(R.layout.pickerview_custom_options, new CustomListener() {
@Override
public void customLayout(View v) {
//自定义布局中的控件初始化及事件处理
final TextView tvSubmit = (TextView) v.findViewById(R.id.tv_finish);
final TextView tvAdd = (TextView) v.findViewById(R.id.tv_add);
ImageView ivCancel = (ImageView) v.findViewById(R.id.iv_cancel);
tvSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pvCustomOptions.returnData(tvSubmit);
}
});
ivCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pvCustomOptions.dismiss();
}
});
tvAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getData();
pvCustomOptions.setPicker(cardItem);
}
});
}
})
.build();
pvCustomOptions.setPicker(cardItem);//添加数据