如何用 Android-PickerView 快速实现自定义年月日时分秒时间选择器:从零到实战的完整指南

📅 2026/8/17 17:20:19
如何用 Android-PickerView 快速实现自定义年月日时分秒时间选择器:从零到实战的完整指南
如何用 Android-PickerView 快速实现自定义年月日时分秒时间选择器从零到实战的完整指南【免费下载链接】Android-PickerViewThis is a picker view for android , support linkage effect, timepicker and optionspicker.时间选择器、省市区三级联动项目地址: https://gitcode.com/gh_mirrors/an/Android-PickerViewAndroid-PickerView 是 Android 开发中非常经典的时间选择器开源库它把年、月、日、时、分、秒每一列都拆成独立滚轮配合 TimePickerBuilder 的链式调用你可以自由决定显示哪些时间单位、标签叫什么、弹层长什么样。这篇实战文章会带你从零跑通一个自定义年月日时分秒的时间选择器并把最常见的坑一次性排干净。别再被系统时间选择器锁死了假设产品经理丢给你一个需求预约表单里要一个时间选择器只显示年、月、日、时、分秒不要标签要用中文底部弹出整层颜色还得和 App 主色调一致。拿着系统自带的 DatePicker 比划两下你就明白了它只能选日期没有时分秒的滚轮格式被焊死样式固定改标题栏、改颜色基本是痴心妄想想限制可选范围得自己在回调里写校验逻辑越界了只能弹个 Toast 糊弄用户。而 Android-PickerView 的思路完全不同。它的每一列单位都是一个 WheelView 滚轮显示哪几列、每列叫什么名字、用多大字号什么颜色全部交给 Builder 配置。更狠的是整个弹层都能替换成你自己的布局文件。这里还有个现实痛点这个库早期通过 jcenter 仓库分发而 jcenter 已于 2021 年正式关闭compile com.contrarywind:Android-PickerView:4.1.9这条依赖现在大概率拉不下来。别慌官方 README 给出了明确方案——直接克隆源码把pickerview和wheelview两个 module 引入工程按需改造。 三步快速接入一个基础时间选择器第一步引入 module。把仓库里的pickerview、wheelview两个目录拷进你的工程并在settings.gradle中注册// settings.gradle include :app include :pickerview include :wheelview第二步写最小可用代码。在任意 Activity 里创建一个 TimePickerBuilder 实例回调里拿到的date就是最终选中的时间TimePickerView pvTime new TimePickerBuilder(this, new OnTimeSelectListener() { Override public void onTimeSelect(Date date, View v) { Toast.makeText(MainActivity.this, new SimpleDateFormat(yyyy-MM-dd HH:mm:ss).format(date), Toast.LENGTH_SHORT).show(); } }).build();第三步弹出它。在按钮点击处调用pvTime.show()一个带取消/确定按钮、默认显示完整年月日时分秒的滚轮选择器就弹出来了。三步搞定基础效果。真正的重头戏在下面——怎么把它调教成业务想要的样子。进阶技巧拆解两个入口玩转显示单位与标签技巧一用 setType 决定显示哪几列用 setLabel 决定每列叫什么这是自定义时间格式最核心的入口。setType接收一个长度固定为 6 的布尔数组按年、月、日、时、分、秒的顺序决定每一列滚轮是否出现。比如只要时分秒pvTime new TimePickerBuilder(this, new OnTimeSelectListener() { /* ... */ }) .setType(new boolean[]{false, false, false, true, true, true}) // 只显示 时 分 秒 .setLabel(, , , 时, 分, 秒) // 参数与 type 一一对应 .isCenterLabel(false) // false每一行都带标签true仅中间选中项带 .build();两个提示其一setLabel的六个参数与setType一一对应被隐藏的单位填什么都不起作用其二isCenterLabel默认是 true改成 false 后每行都会显示时/分/秒观感更接近原生 iOS 滚轮。如果标签挤在一起还能用setTextXOffset(0, 0, 0, 40, 0, -40)对每一列做水平偏移微调。技巧二setLayoutRes 整层换肤连标题栏都自己画如果连顶部的取消/确定都想换成自定义按钮、甚至加个图标就该请出setLayoutRes了。它接收布局资源 id 和一个回调你在回调里对布局中的控件做初始化pvCustomTime new TimePickerBuilder(this, new OnTimeSelectListener() { /* ... */ }) .setLayoutRes(R.layout.pickerview_custom_time, new CustomListener() { Override public void customLayout(View v) { // v 就是自定义布局的根 View 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(); } }); } }) .build();这里有个硬性要求自定义布局里必须保留一个 id 为timepicker的容器里面按顺序放好 id 分别为year、month、day、hour、min、second的 WheelView否则库在 findViewById 阶段直接空指针。标准写法参考app/src/main/res/layout/pickerview_custom_time.xml照抄改样式最稳妥。⚠️ 避坑指南这几个雷我替你先踩了坑一Calendar 的月份从 0 开始。用setRangDate(startDate, endDate)限制范围时startDate.set(2024, 1, 1)代表的其实是 2024 年 2 月月份取值 0–11想设 1 月必须写set(2024, 0, 1)。官方在 demo 里专门用注释强调过这件事。坑二setItemVisibleCount 传偶数会被自动加一。最大可见条目数建议传 3、5、7、9 这样的奇数传 6 实际会变成 7。这不是 bug是滚轮需要保证中心对称源码注释写得很明白。坑三自定义布局忘保留固定 id运行直接崩溃。前面强调过timepicker容器和六个 WheelView 的 id 一个都不能少、不能改名。自定义布局最安全的姿势就是复制 demo 里的 layout 再改视觉样式。坑四想要底部弹出得配合 Dialog 模式。默认是居中弹出。想实现 iOS 那种底部弹层需要isDialog(true)之后再拿到 Dialog 的 Window设置Gravity.BOTTOM和进出场动画demo 里的initTimePicker()有完整写法直接抄。完整实战整合做一个预约上门时间选择器把上面的技巧揉进一个真实业务上门维修预约需要选择今天到明年年底之间的任意时间精确到分钟即可标签用中文主题色用品牌绿。整合后的完整代码如下Calendar startDate Calendar.getInstance(); // 起点今天 Calendar endDate Calendar.getInstance(); // 终点明年年底 endDate.set(Calendar.YEAR, endDate.get(Calendar.YEAR) 1); endDate.set(Calendar.MONTH, 11); // 12月 endDate.set(Calendar.DAY_OF_MONTH, 31); pvReserve new TimePickerBuilder(this, new OnTimeSelectListener() { Override public void onTimeSelect(Date date, View v) { tvResult.setText(new SimpleDateFormat(yyyy-MM-dd HH:mm).format(date)); } }) .setType(new boolean[]{true, true, true, true, true, false}) // 隐藏秒 .setLabel(年, 月, 日, 时, 分, ) .setDate(Calendar.getInstance()) // 默认选中当前时间 .setRangDate(startDate, endDate) // 限制可选范围 .setContentTextSize(18) // 滚轮文字大小 .setDividerColor(0xFF24AD9D) // 分割线品牌色 .setTextColorCenter(0xFF24AD9D) // 选中项品牌色 .setLineSpacingMultiplier(1.6f) // 行间距倍数 .isCyclic(true) // 允许循环滚动 .build(); pvReserve.show();跑起来你会发现秒列消失、范围限制生效、每列标签都是中文、选中项和分割线统一成品牌绿。这正是 Android-PickerView 自定义年月日时分秒时间选择器最典型的实战形态。经验沉淀与延伸回顾整个自定义过程其实就是在回答三个问题显示哪些列setType、每列叫什么setLabel、弹层长什么样setLayoutRes 加上颜色字号这一串方法。想清楚这三点任何时间选择需求都能拆解成几行链式调用思路瞬间清晰。想继续深入可以从这几处源码下手看 demo 的app/src/main/java/com/bigkoo/pickerviewdemo/MainActivity.java农历模式setLunarCalendar、Dialog 底部弹出、夜间主题的写法都在里面研究pickerview/src/main/java/com/bigkoo/pickerview/builder/TimePickerBuilder.java所有可配置方法与其注释都在这个文件里是最好的参数词典如果业务还需要省市区三级联动就看OptionsPickerBuilder和app/src/main/assets/province.json的解析示例思路同源。动手最快的路径是把仓库git clone https://gitcode.com/gh_mirrors/an/Android-PickerView拉到本地跑一遍官方 demo再对照本文把参数逐个改着玩。源码永远是最好的老师等你在自己的项目里把它调出想要的效果时这套自定义思路就真正属于你了。【免费下载链接】Android-PickerViewThis is a picker view for android , support linkage effect, timepicker and optionspicker.时间选择器、省市区三级联动项目地址: https://gitcode.com/gh_mirrors/an/Android-PickerView创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考