3行代码搞定Android时间选择器:Android-PickerView极速集成指南
你是否还在为Android原生时间选择器的丑陋界面抓狂?还在为复杂的日期逻辑处理焦头烂额?Android-PickerView帮你3行核心代码实现iOS风格的时间选择功能,让用户体验瞬间提升一个档次。读完本文你将获得:
- 3分钟内完成时间选择器集成的实操能力
- 个性化样式定制的核心技巧
- 常见需求如农历切换、时间范围限制的解决方案
- 官方Demo全解析,轻松应对复杂场景
认识Android-PickerView
Android-PickerView是一款仿iOS的PickerView控件,提供了两种核心选择器:
- TimePickerView(时间选择器):支持年月日时分、年月日、年月、时分等多种格式
- OptionsPickerView(选项选择器):支持一、二、三级选项选择,可设置是否联动
项目核心模块结构:
- 时间选择器核心:pickerview/view/TimePickerView.java
- 选项选择器核心:pickerview/view/OptionsPickerView.java
- 构建器模式实现:pickerview/builder/TimePickerBuilder.java
- 官方示例代码:app/src/main/java/com/bigkoo/pickerviewdemo/MainActivity.java
该库已被招商银行"掌上生活"等知名App采用,稳定性和实用性经过市场验证:
极速集成步骤
1. 添加依赖
在项目的build.gradle中添加Jcenter仓库依赖:
compile 'com.contrarywind:Android-PickerView:4.1.9'
或使用Maven:
<dependency>
<groupId>com.contrarywind</groupId>
<artifactId>Android-PickerView</artifactId>
<version>4.1.9</version>
<type>pom</type>
</dependency>
2. 3行核心代码实现时间选择器
在需要使用时间选择器的Activity中,添加以下代码:
// 创建时间选择器
TimePickerView pvTime = new TimePickerBuilder(MainActivity.this, new OnTimeSelectListener() {
@Override
public void onTimeSelect(Date date, View v) {
// 选中时间回调
Toast.makeText(MainActivity.this, getTime(date), Toast.LENGTH_SHORT).show();
}
}).build();
// 显示时间选择器
pvTime.show();
其中getTime()方法用于格式化日期显示:
private String getTime(Date date) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return format.format(date);
}
3. 基础样式定制
通过TimePickerBuilder可以轻松定制选择器样式,以下是常用配置:
Calendar selectedDate = Calendar.getInstance();
Calendar startDate = Calendar.getInstance();
startDate.set(2013, 0, 1); // 注意月份是从0开始的
Calendar endDate = Calendar.getInstance();
endDate.set(2025, 11, 31);
pvTime = new TimePickerBuilder(this, new OnTimeSelectListener() {
@Override
public void onTimeSelect(Date date, View v) {
tvTime.setText(getTime(date));
}
})
.setType(new boolean[]{true, true, true, true, true, true}) // 年月日时分秒
.setCancelText("取消")//取消按钮文字
.setSubmitText("确定")//确认按钮文字
.setContentSize(18)//滚轮文字大小
.setTitleSize(20)//标题文字大小
.setTitleText("选择日期时间")//标题文字
.setOutSideCancelable(false)//点击外部是否取消
.isCyclic(true)//是否循环滚动
.setDate(selectedDate)//默认选中时间
.setRangDate(startDate,endDate)//时间范围
.setLabel("年","月","日","时","分","秒")//单位标签
.build();
高级功能实战
农历与公历切换
Android-PickerView内置农历支持,通过自定义布局实现公农历切换功能:
// 公农历切换选择器初始化
private void initLunarPicker() {
Calendar selectedDate = Calendar.getInstance();
Calendar startDate = Calendar.getInstance();
startDate.set(2014, 1, 23);
Calendar endDate = Calendar.getInstance();
endDate.set(2069, 2, 28);
pvCustomLunar = new TimePickerBuilder(this, new OnTimeSelectListener() {
@Override
public void onTimeSelect(Date date, View v) {
Toast.makeText(MainActivity.this, getTime(date), Toast.LENGTH_SHORT).show();
}
})
.setDate(selectedDate)
.setRangDate(startDate, endDate)
.setLayoutRes(R.layout.pickerview_custom_lunar, new CustomListener() {
@Override
public void customLayout(final View v) {
// 公农历切换CheckBox
CheckBox cb_lunar = (CheckBox) v.findViewById(R.id.cb_lunar);
cb_lunar.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// 切换农历/公历
pvCustomLunar.setLunarCalendar(!pvCustomLunar.isLunarCalendar());
}
});
}
})
.setType(new boolean[]{true, true, true, false, false, false})
.isCenterLabel(false)
.build();
}
对应的自定义布局文件:app/src/main/res/layout/pickerview_custom_lunar.xml
自定义时间选择器样式
通过修改布局文件和Builder配置,可以实现完全个性化的时间选择器。例如只显示时分秒的选择器:
// 自定义时间选择器
private void initCustomTimePicker() {
Calendar selectedDate = Calendar.getInstance();
Calendar startDate = Calendar.getInstance();
startDate.set(2014, 1, 23);
Calendar endDate = Calendar.getInstance();
endDate.set(2027, 2, 28);
pvCustomTime = new TimePickerBuilder(this, new OnTimeSelectListener() {
@Override
public void onTimeSelect(Date date, View v) {
btn_CustomTime.setText(getTime(date));
}
})
.setDate(selectedDate)
.setRangDate(startDate, endDate)
.setLayoutRes(R.layout.pickerview_custom_time, new CustomListener() {
@Override
public void customLayout(View v) {
// 自定义布局中的控件初始化
final TextView tvSubmit = (TextView) v.findViewById(R.id.tv_finish);
ImageView ivCancel = (ImageView) v.findViewById(R.id.iv_cancel);
tvSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pvCustomTime.returnData();
pvCustomTime.dismiss();
}
});
ivCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pvCustomTime.dismiss();
}
});
}
})
.setType(new boolean[]{false, false, false, true, true, true}) // 只显示时分秒
.setLabel("年", "月", "日", "时", "分", "秒")
.isCenterLabel(false)
.build();
}
自定义布局文件:app/src/main/res/layout/pickerview_custom_time.xml
城市三级联动选择
除了时间选择,Android-PickerView还支持选项选择器,特别适合实现省市区三级联动:
// 选项选择器初始化
private void initOptionPicker() {
pvOptions = new OptionsPickerBuilder(this, new OnOptionsSelectListener() {
@Override
public void onOptionsSelect(int options1, int options2, int options3, View v) {
// 返回的分别是三个级别的选中位置
String tx = options1Items.get(options1).getPickerViewText()
+ options2Items.get(options1).get(options2);
btn_Options.setText(tx);
}
})
.setTitleText("城市选择")
.setContentTextSize(20)
.setDividerColor(Color.LTGRAY)
.setSelectOptions(0, 1)
.setLabels("省", "市", "区")
.build();
// 设置数据源
pvOptions.setPicker(options1Items, options2Items);
}
完整的省市区数据解析示例可以参考:app/src/main/java/com/bigkoo/pickerviewdemo/JsonDataActivity.java
官方Demo完整解析
官方Demo提供了所有功能的实现示例,位于app/src/main/java/com/bigkoo/pickerviewdemo/MainActivity.java,主要包含以下功能演示:
主要演示功能
- 基础时间选择器:展示默认样式的时间选择器
- 自定义时间选择器:演示如何通过自定义布局修改时间选择器样式
- 农历时间选择器:公农历切换功能实现
- 选项选择器:二级联动示例
- 自定义选项选择器:自定义布局的选项选择器
- 非联动选项选择器:三级非联动选择示例
- 省市区选择器:JSON数据解析与三级联动
布局文件说明
Demo中使用的布局文件位于app/src/main/res/layout/目录下,主要包括:
- activity_main.xml:主界面布局
- pickerview_custom_lunar.xml:农历时间选择器布局
- pickerview_custom_options.xml:自定义选项选择器布局
- pickerview_custom_time.xml:自定义时间选择器布局
注意事项与常见问题
月份设置问题
重要:Calendar组件的月份是从0开始的(0-11代表1-12月),设置起始和终止日期时需特别注意:
// 错误示例
startDate.set(2013, 1, 1); // 实际会设置为2013年2月1日
endDate.set(2020, 12, 1); // 实际会设置为2021年1月1日
// 正确示例
startDate.set(2013, 0, 1); // 2013年1月1日
endDate.set(2020, 11, 31); // 2020年12月31日
自定义布局注意事项
自定义布局时,id为optionspicker或timepicker的布局及其子控件必须保留,否则会报空指针异常。可以参考Demo中的自定义布局文件:
只需要WheelView基础控件
如果只需要基础的WheelView控件自行扩展,可以单独依赖wheelview库:
compile 'com.contrarywind:wheelview:4.1.0'
WheelView的使用示例:
<com.contrarywind.view.WheelView
android:id="@+id/wheelview"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
WheelView wheelView = findViewById(R.id.wheelview);
wheelView.setCyclic(false);
final List<String> mOptionsItems = new ArrayList<>();
mOptionsItems.add("item0");
mOptionsItems.add("item1");
mOptionsItems.add("item2");
wheelView.setAdapter(new ArrayWheelAdapter(mOptionsItems));
wheelView.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(int index) {
Toast.makeText(MainActivity.this, "" + mOptionsItems.get(index), Toast.LENGTH_SHORT).show();
}
});
项目获取与安装
直接依赖
通过Gradle或Maven直接依赖Jcenter仓库中的库(推荐):
compile 'com.contrarywind:Android-PickerView:4.1.9'
源码获取
通过以下地址获取完整源码:
git clone https://gitcode.com/gh_mirrors/an/Android-PickerView
源码目录结构:
Android-PickerView/
├── app/ // 示例Demo
├── pickerview/ // 库源码
├── wheelview/ // WheelView基础控件
└── preview/ // 预览图片
总结
Android-PickerView通过简洁的API设计和丰富的自定义选项,帮助开发者快速实现高质量的选择器功能。本文介绍的3行代码集成方法只是基础,通过自定义布局和样式,几乎可以实现任何iOS风格的选择器效果。
官方文档和更多高级用法可以参考项目Wiki(已停止更新,建议直接查看源码和Demo)。如果需要实现更复杂的选择器功能,可以直接修改源码进行定制。
最后,项目虽已停止更新,但现有版本功能稳定,可以通过下载源码的方式进行二次开发和维护,满足特定需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考







