AndroidPicker
安卓选择器类库,包括日期及时间选择器(可用于出生日期、营业时间等)、单项选择器(可用于性别、民族、职业、学历、星座等)、二三级联动选择器(可用于车牌号、基金定投日期等)、城市地址选择器(分省级、地市级及区县级)、数字选择器(可用于年龄、身高、体重、温度等)、日历选日期择器(可用于酒店及机票预定日期)、颜色选择器、文件及目录选择器、图片选择器等……WheelPicker/DatePicker/TimePicker/OptionPicker/NumberPicker/LinkagePicker/AddressPicker/CarPlatePicker/CalendarPicker/ColorPicker/FilePicker/ImagePicker etc.
Install / Use
/learn @gzu-liyujiang/AndroidPickerREADME
AndroidPicker
安卓选择器类库,包括日期及时间选择器(可用于出生日期、营业时间等)、单项选择器(可用于性别、民族、职业、学历、星座等)、二三级联动选择器(可用于车牌号、基金定投日期等)、城市地址选择器(分省级、地市级及区县级)、数字选择器(可用于年龄、身高、体重、温度等)、日历选日期择器(可用于酒店及机票预定日期)、颜色选择器、文件及目录选择器等……
【抱歉!各位小伙伴,从2022年开始我已经没做安卓开发了,项目虽然已经趋于稳定,不过需要大家参与维护,多提PullRequest,我目前已经没法贡献代码了】
欢迎大伙儿在Issues提交你的意见或建议。欢迎 Fork & Pull requests 贡献您的代码,大家共同学习【AndroidPicker 交流群 604235437】。
- GitHub:https://github.com/gzu-liyujiang/AndroidPicker
- 码云(GitEE):https://gitee.com/li_yu_jiang/AndroidPicker
- Demo:https://github.com/gzu-liyujiang/AndroidPicker/blob/master/demo.apk
接入指引
最新版本 :
(具体历史版本号参见 更新日志)
注意事项
- 3.0.0 开始完全重构了底层代码,改进了性能,对 XML 布局更友好, 3.x 版本 的 API 和 1.x 及 2.x 版本的不大一样,请谨慎升级。
- 1.x Support 版本封存分支
- 2.0 androidx 版本封存分支
依赖配置
在项目根目录下的build.gradle中
如果你的项目 Gradle 配置是在 7.0 以下,需要在 build.gradle 文件中加入:
allprojects {
repositories {
// JitPack 远程仓库:https://jitpack.io
maven { url 'https://jitpack.io' }
}
}
如果你的 Gradle 配置是 7.0 及以上,则需要在 settings.gradle 文件中加入:
dependencyResolutionManagement {
repositories {
// JitPack 远程仓库:https://jitpack.io
maven { url 'https://jitpack.io' }
}
}
在项目模块下的build.gradle中(以下依赖项不必全部引入,请按需来)
所有选择器的基础窗体(用于自定义弹窗):
dependencies {
implementation 'com.github.gzu-liyujiang.AndroidPicker:Common:<version>'
}
滚轮选择器的滚轮控件(用于自定义滚轮选择器):
dependencies {
implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelView:<version>'
}
单项/数字、二三级联动、日期/时间等滚轮选择器:
dependencies {
implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:<version>'
}
省市区地址选择器:
dependencies {
implementation 'com.github.gzu-liyujiang.AndroidPicker:AddressPicker:<version>'
}
文件/目录选择器:
dependencies {
implementation 'com.github.gzu-liyujiang.AndroidPicker:FilePicker:<version>'
}
颜色选择器:
dependencies {
implementation 'com.github.gzu-liyujiang.AndroidPicker:ColorPicker:<version>'
}
日历日期选择器(README.md):
dependencies {
implementation 'com.github.gzu-liyujiang.AndroidPicker:CalendarPicker:<version>'
}
图片选择器(README.md):
dependencies {
implementation 'com.github.gzu-liyujiang.AndroidPicker:ImagePicker:<version>'
}
旧版本 AndroidX 稳定版本 (不推荐):
dependencies {
implementation 'com.github.gzu-liyujiang.AndroidPicker:Common:2.0.0'
implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:2.0.0'
implementation 'com.github.gzu-liyujiang.AndroidPicker:FilePicker:2.0.0'
implementation 'com.github.gzu-liyujiang.AndroidPicker:ColorPicker:2.0.0'
}
旧版本 Support 稳定版本 (不推荐):
dependencies {
implementation 'com.github.gzu-liyujiang.AndroidPicker:Common:1.5.6.20181018'
implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:1.5.6.20181018'
implementation 'com.github.gzu-liyujiang.AndroidPicker:FilePicker:1.5.6.20181018'
implementation 'com.github.gzu-liyujiang.AndroidPicker:ColorPicker:1.5.6.20181018'
}
API 说明
API 说明文档 。
混淆规则
项目库混淆无需额外配置。
用法示例
常见用法请参阅 demo,高级用法请细读源码, 诸如可以重写同名的assets/china_address.json来自定义省市区数据,
重写同名的DialogSheetAnimation来自定义弹窗动画……。 代码是最好的老师,强烈建议拉取代码运行,尝试修改 demo 对比查看实际效果以便加深理解。
在 Java 中
List<GoodsCategoryBean> data = new ArrayList<>();
data.add(new GoodsCategoryBean(1, "食品生鲜"));
data.add(new GoodsCategoryBean(2, "家用电器"));
data.add(new GoodsCategoryBean(3, "家居生活"));
data.add(new GoodsCategoryBean(4, "医疗保健"));
data.add(new GoodsCategoryBean(5, "酒水饮料"));
data.add(new GoodsCategoryBean(6, "图书音像"));
OptionPicker picker = new OptionPicker(this);
picker.setTitle("货物分类");
picker.setBodyWidth(140);
picker.setData(data);
picker.setDefaultPosition(2);
picker.setOnOptionPickedListener(this);
//OptionWheelLayout wheelLayout = picker.getWheelLayout();
//wheelLayout.setIndicatorEnabled(false);
//wheelLayout.setTextColor(0xFFFF00FF);
//wheelLayout.setSelectedTextColor(0xFFFF0000);
//wheelLayout.setTextSize(15 * view.getResources().getDisplayMetrics().scaledDensity);
//wheelLayout.setSelectedTextBold(true);
//wheelLayout.setCurtainEnabled(true);
//wheelLayout.setCurtainColor(0xEEFF0000);
//wheelLayout.setCurtainCorner(CurtainCorner.ALL);
//wheelLayout.setCurtainRadius(5 * view.getResources().getDisplayMetrics().density);
//wheelLayout.setOnOptionSelectedListener(new OnOptionSelectedListener() {
// @Override
// public void onOptionSelected(int position, Object item) {
// picker.getTitleView().setText(picker.getWheelView().formatItem(position));
// }
//});
picker.show();
DatePicker picker = new DatePicker(this);
//picker.setBodyWidth(240);
//DateWheelLayout wheelLayout = picker.getWheelLayout();
//wheelLayout.setDateMode(DateMode.YEAR_MONTH_DAY);
//wheelLayout.setDateLabel("年", "月", "日");
//wheelLayout.setDateFormatter(new UnitDateFormatter());
//wheelLayout.setRange(DateEntity.target(2021, 1, 1), DateEntity.target(2050, 12, 31), DateEntity.today());
//wheelLayout.setCurtainEnabled(true);
//wheelLayout.setCurtainColor(0xFFCC0000);
//wheelLayout.setIndicatorEnabled(true);
//wheelLayout.setIndicatorColor(0xFFFF0000);
//wheelLayout.setIndicatorSize(view.getResources().getDisplayMetrics().density * 2);
//wheelLayout.setTextColor(0xCCCC0000);
//wheelLayout.setSelectedTextColor(0xFFFF0000);
//wheelLayout.getYearLabelView().setTextColor(0xFF999999);
//wheelLayout.getMonthLabelView().setTextColor(0xFF999999);
picker.getWheelLayout().setResetWhenLinkage(false);
picker.setOnDatePickedListener(this);
picker.show();
AddressPicker picker = new AddressPicker(this);
picker.setAddressMode(AddressMode.PROVINCE_CITY);
//picker.setAddressMode("china_address_guizhou_city.json", AddressMode.PROVINCE_CITY,
// new AddressJsonParser.Builder()
// .provinceCodeField("code")
// .provinceNameField("name")
// .provinceChildField("city")
// .cityCodeField("code")
// .cityNameField("name")
// .cityChildField("area")
// .countyCodeField("code")
// .countyNameField("name")
// .build());
//picker.setTitle("贵州省地址选择");
//picker.setDefaultValue("贵州省", "毕节市", "纳雍县");
picker.setOnAddressPickedListener(this);
//LinkageWheelLayout wheelLayout = picker.getWheelLayout();
//wheelLayout.setTextSize(15 * view.getResources().getDisplayMetrics().scaledDensity);
//wheelLayout.setSelectedTextBold(true);
//wheelLayout.setIndicatorEnabled(false);
//wheelLayout.setCurtainEnabled(true);
//wheelLayout.setCurtainColor(0xEE0081FF);
//wheelLayout.setCurtainRadius(5 * view.getResources().getDisplayMetrics().density);
//int padding = (int) (10 * view.getResources().getDisplayMetrics().density);
//wheelLayout.setPadding(padding, 0, padding, 0);
//wheelLayout.setOnLinkageSelectedListener(new OnLinkageSelectedListener() {
// @Override
// public void onLinkageSelected(Object first, Object second, Object third) {
// picker.getTitleView().setText(String.format("%s%s%s",
// picker.getProvinceWheelView().formatItem(first),
// picker.getCityWheelView().formatItem(second),
// picker.getCountyWheelView().formatItem(third)));
// }
//});
//picker.getProvinceWheelView().setCurtainCorner(CurtainCorner.LEFT);
//picker.getCityWheelView().setCurtainCorner(CurtainCorner.RIGHT);
picker.show();
在 XML 中
<com.github.gzuliyujiang.wheelview.widget.WheelView
android:id="@+id/wheel_view"
android:layout_width="117dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
app:wheel_atmosphericEnabled="true"
app:wheel_curvedEnabled="true"
app:wheel_curvedIndicatorSpace="4dp"
app:wheel_curvedMaxAngle="60"
app:wheel_indicatorColor="#FF0081FF"
app:wheel_itemSpace="50dp"
app:wheel_itemTextColor="#FF474747"
app:wheel_itemTextColorSelected="#FF0081FF"
app:wheel_itemTextSize="20sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.github.gzuliyujiang.wheelpicker.widget.OptionWheelLayout
android:id="@+id/wheel_option"
android:layout_width="90dp"
android:layout_height="150dp"
android:layout_gravity="center_horizontal"
app:wheel_itemTextAlign="center" />
<com.github.gzuliyujiang.wheelpicker.widget.DateWheelLayout
android:layout_width="120dp"
android:layout_height="150dp"
android:layout_gravity="center_horizontal"
app:wheel_dateMode="month_day"
app:wheel_dayLabel="日"
app:wheel_monthLabel="月" />
...
</LinearLayout>
自定义样式(可选)
全局配置所有选择器样式及配色
//4.0.0版本开始内置支持四种弹窗样式(Default、One、Two、Three),效果可运行Demo查看
public class DemoApp extends Application {
@Override
public void onCreate() {
super.onCreate();
DialogConfig.setDialogStyle(DialogStyle.Default);
DialogConfig.setDialogColor(new DialogColor()
.cancelTextColor(0xFF999999)
.okTextColor(0xFF0099CC));
}
}
自定义 style
- 调用
setStyle(只作用于当前选择器,推荐)
在app/.../res/values/styles.xml中参考WheelDefault写个style,然后设置。
picker.getWheelView().setStyle(R
Related Skills
node-connect
346.8kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
107.6kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
346.8kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
346.8kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
