# AndroidPicker
安卓选择器类库,包括日期及时间选择器(可用于出生日期、营业时间等)、单项选择器(可用于性别、民族、职业、学历、星座等)、二三级联动选择器(可用于车牌号、基金定投日期等)、城市地址选择器(分省级、地市级及区县级)、数字选择器(可用于年龄、身高、体重、温度等)、日历选日期择器(可用于酒店及机票预定日期)、颜色选择器、文件及目录选择器等……
【抱歉!各位小伙伴,从2022年开始我已经没做安卓开发了,项目虽然已经趋于稳定,不过需要大家参与维护,多提PullRequest,我目前已经没法贡献代码了】
欢迎大伙儿在Issues提交你的意见或建议。欢迎 Fork & Pull requests 贡献您的代码,大家共同学习【AndroidPicker 交流群 604235437】。
最新版本 :
(具体历史版本号参见 更新日志)
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 说明文档 。
项目库混淆无需额外配置。
常见用法请参阅 demo,高级用法请细读源码, 诸如可以重写同名的assets/china_address.json来自定义省市区数据,
重写同名的DialogSheetAnimation来自定义弹窗动画……。 代码是最好的老师,强烈建议拉取代码运行,尝试修改 demo 对比查看实际效果以便加深理解。
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();
<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));
}
}
setStyle(只作用于当前选择器,推荐)在app/.../res/values/styles.xml中参考WheelDefault写个style,然后设置。
picker.getWheelView().setStyle(R.style.WheelStyleDemo);
WheelDefault覆盖 (所有选择器都会生效,不推荐)在app/.../res/values/styles.xml中重写WheelDefault覆盖 。
<style name="WheelDefault">
<item name="wheel_itemSpace">15dp</item>
<item name="wheel_itemTextColor">@android:color/darker_gray</item>
<item name="wheel_itemTextColorSelected">@android:color/holo_blue_dark</item>
<item name="wheel_itemTextSize">16sp</item>
<item name="wheel_itemTextSizeSelected">18sp</item>
<item name="wheel_itemTextBoldSelected">false</item>
<item name="wheel_sameWidthEnabled">false</item>
<item name="wheel_atmosphericEnabled">true</item>
<item name="wheel_curtainEnabled">false</item>
<item name="wheel_curtainColor">#FFDEDEDE</item>
<item name="wheel_curvedEnabled">false</item>
<item name="wheel_curvedMaxAngle">90</item>
<item name="wheel_cyclicEnabled">false</item>
<item name="wheel_indicatorEnabled">true</item>
<item name="wheel_indicatorColor">@android:color/holo_blue_light</item>
<item name="wheel_indicatorSize">1dp</item>
</style>
//仿蚂蚁财富APP定投周期选择弹窗样式
public class AntFortuneLikePicker extends LinkagePicker {
private int lastDialogStyle;
public AntFortuneLikePicker(@NonNull Activity activity) {
super(activity);
}
@Override
protected void onInit(@NonNull Context context) {
super.onInit(context);
lastDialogStyle = DialogConfig.getDialogStyle();
DialogConfig.setDialogStyle(DialogStyle.Default);
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
DialogConfig.setDialogStyle(lastDialogStyle);
}
@Override
protected void initData() {
super.initData();
setBackgroundColor(0xFFFFFFFF);
cancelView.setText("取消");
cancelView.setTextSize(16);
cancelView.setTextColor(0xFF0081FF);
okView.setTextColor(0xFF0081FF);
okView.setText("确定");
okView.setTextSize(16);
titleView.setTextColor(0xFF333333);
titleView.setText("定投周期");
titleView.setTextSize(16);
wheelLayout.setData(new AntFortuneLikeProvider());
wheelLayout.setAtmosphericEnabled(true);
wheelLayout.setVisibleItemCount(7);
wheelLayout.setCyclicEnabled(false);
wheelLayout.setIndicatorEnabled(true);
wheelLayout.setIndicatorColor(0xFFDDDDDD);
wheelLayout.setIndicatorSize((int) (contentView.getResources().getDisplayMetrics().density * 1));
wheelLayout.setTextColor(0xFF999999);
wheelLayout.setSelectedTextColor(0xFF333333);
wheelLayout.setCurtainEnabled(false);
wheelLayout.setCurvedEnabled(false);
}
}
````
### 和`DialogFragment`结合
`XXXPicker` 都继承自 `android.app.Dialog` ,因此可以直接和`androidx.fragment.app.DialogFragment`结合使用。
```java
public class OptionPickerFragment extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
OptionPicker picker = new OptionPicker(requireActivity());
picker.setData("土人", "里民子", "羡民", "穿青人", "不在56个民族之内", "未定民族");
picker.setOnOptionPickedListener(new OnOptionPickedListener() {
@Override
public void onOptionPicked(int position, Object item) {
Toast.makeText(requireContext(), item.toString(), Toast.LENGTH_SHORT).show();
}
});
picker.getWheelView().setStyle(R.style.WheelStyleDemo);
return picker;
}
}
以下图片显示的效果可能已修改过,实际效果请运行 demo 查看。









$ claude mcp add AndroidPicker \
-- python -m otcore.mcp_server <graph>