每天记录学习的新知识:PickerView 时间选择器
一个萌萌哒的程序媛: https://blog.****.net/m0_37794706/article/details/78903576
丶小嵩 https://blog.****.net/qq_22393017/article/details/58099486
一个萌萌哒的程序媛的 github: https://github.com/Bigkoo/Android-PickerView
Function:
支持选择年、月、日的范围。
支持年月日时分秒显示。
支持设置当前默认时间。
支持自定义布局。
支持自定义标题栏。
支持“年,月,日,时,分,秒”等选项的单位(label)显示、隐藏和自定义。
支持dialog 模式显示。
支持自定义设置容器。
API:
a.1. TimePicker.Builder:
.OnTimeSelectListener:选中时间回调,需要在Builder构造方法中指定,不能改变。void onTimeSelect(Date date, View v) 这里回调过来的v,就是show()方法里面所添加的 View 参数,如果show的时候没有添加参数,v则为null
.setSelectedDate :设置选中时间戳
.setInterceptor :设置拦截器
.setFormatter :设置Formatter,内部提供默认的Formatter
.create :通过Builder构建 TimePicker
.setType(new boolean[]{true, true, true, false, false, false}) //年月日时分秒 的显示与否,不设置则默认全部显示
.setLabel("年", "月", "日", "", "", "")//默认设置为年月日时分秒
.setSubmitText("确定")//确定按钮文字
.setCancelText("取消")//取消按钮文字
.setTitleText("请选择")//标题
.setSubCalSize(18)//确定和取消文字大小
.setTitleSize(20)//标题文字大小
.setTitleColor(Color.GREEN)//标题文字颜色
.setSubmitColor(Color.GREEN)//确定按钮文字颜色
.setCancelColor(Color.GREEN)//取消按钮文字颜色
.setTitleBgColor(0xFF333333)//标题背景颜色 Night mode
.setBgColor(0xFF000000)//滚轮背景颜色 Night mode
.setOutSideCancelable(false)//点击屏幕,点在控件外部范围时,是否取消显示
.isCyclic(false)//是否循环滚动
.isCenterLabel(false) //是否只显示中间选中项的label文字,false则每项item全部都带有label。
.setDividerColor(Color.YELLOW)//设置分割线的颜色
.setTextColorCenter(Color.RED)//设置选中项的颜色
.setTextColorOut(Color.BLUE)//设置没有被选中项的颜色
.setContentSize(21)//滚轮文字大小
.setDate(selectedDate)//// 如果不设置的话,默认是系统时间*/
.setLineSpacingMultiplier(1.2f)//设置两横线之间的间隔倍数
.setTextXOffset(-10, 0, 10, 0, 0, 0)//设置X轴倾斜角度[ -90 , 90°]
.setRangDate(startDate, endDate)////起始终止年月日设定
.setBackgroundId(0x00FFFFFF) //设置外部遮罩颜色
.setDecorView(null)//设置要将pickerview显示到的容器id 必须是viewgroup
.isDialog(false)//是否显示为对话框样式
a.2 TimePicker:
setOnDismissListener:
setDate:根据需求来决定是否使用该方法(一般是精确到秒的情况),此项可以在弹出选择器的时候重新设置当前时间,避免在初始化之后由于时间已经设定,导致选中时间与当前时间不匹配的问题
getType :获取type
hasType:判断是否包含某种type
3.Code:
依赖
implementation 'com.contrarywind:Android-PickerView:3.2.7'
c.1 一个简单的小例子:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_time_picker);
ButterKnife.bind(this);
//时间选择器
TimePickerView pvTime = new TimePickerView.Builder(this,
new TimePickerView.OnTimeSelectListener() {
//选中事件回调
@Override
public void onTimeSelect(Date date, View v) {
activityTimePickerTvTime.setText(getTime(date));
}
})
.build();
pvTime.setDate(Calendar.getInstance());
pvTime.show();
}
/**
* 获取当前时间
*
* @param date :Date 格式时间
* @return String 类型时间
*/
private String getTime(Date date) {
//年月日时分秒 和 年月日
String yMdHms = "yyyy-MM-dd HH:mm:ss";
String yMd = "yyyy-MM-dd";
SimpleDateFormat format = new SimpleDateFormat(yMdHms, Locale.getDefault());
return format.format(date);
}
c.2. 根据Api 重新定义样式的时间选择器
/**
* 选择出生年月日
* 控制时间范围(如果不设置范围,则使用默认时间1900-2100年,此段代码可注释)
* 因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11
*/
private void initTimePicker1() {
//获取当前时间
Date curDate = new Date(System.currentTimeMillis());
SimpleDateFormat formatterYear = new SimpleDateFormat("yyyy ", Locale.getDefault());
String yearStr = formatterYear.format(curDate);
int yearInt = (int) Double.parseDouble(yearStr);
SimpleDateFormat formatterMouth = new SimpleDateFormat("MM ", Locale.getDefault());
String mouthStr = formatterMouth.format(curDate);
int mouthInt = (int) Double.parseDouble(mouthStr);
SimpleDateFormat formatterDay = new SimpleDateFormat("dd ", Locale.getDefault());
String dayStr = formatterDay.format(curDate);
int dayInt = (int) Double.parseDouble(dayStr);
//系统当前时间
Calendar selectedDate = Calendar.getInstance();
Calendar startDate = Calendar.getInstance();
startDate.set(1900, 0, 1);
Calendar endDate = Calendar.getInstance();
endDate.set(yearInt, mouthInt - 1, dayInt);
//时间选择器
TimePickerView pvTime1 = new TimePickerView.Builder(this, new TimePickerView.OnTimeSelectListener() {
//选中事件回调
@Override
public void onTimeSelect(Date date, View v) {
// 这里回调过来的v,就是show()方法里面所添加的 View 参数,如果show的时候没有添加参数,v则为null
activityTimePickerTvTime.setText(getTime(date));
}
})
//年月日时分秒 的显示与否,不设置则默认全部显示
.setType(new boolean[]{true, true, true, false, false, false})
//默认设置为年月日时分秒
.setLabel("年", "月", "日", "", "", "")
.isCenterLabel(false)
.setDividerColor(Color.RED)
//设置选中项的颜色
.setTextColorCenter(Color.RED)
//设置没有被选中项的颜色
.setTextColorOut(Color.BLUE)
.setContentSize(21)
.setDate(selectedDate)
.setLineSpacingMultiplier(1.2f)
//设置X轴倾斜角度[ -90 , 90°]
.setTextXOffset(-10, 0, 10, 0, 0, 0)
.setRangDate(startDate, endDate)
//设置外部遮罩颜色
// .setBackgroundId(0x00FFFFFF)
.setDecorView(null)
.build();
pvTime1.show();
}
c.3. 多级联动
1.需要联动的数据
ArrayList<ProvinceBean> options1Items = new ArrayList<>();
ArrayList<ArrayList<String>> options2Items = new ArrayList<>();
//选项1
options1Items.add(new ProvinceBean(0, "广东", "描述部分", "其他数据"));
options1Items.add(new ProvinceBean(1, "湖南", "描述部分", "其他数据"));
options1Items.add(new ProvinceBean(2, "广西", "描述部分", "其他数据"));
//选项2
ArrayList<String> options2items01 = new ArrayList<>();
options2items01.add("广州");
options2items01.add("佛山");
options2items01.add("东莞");
options2items01.add("珠海");
ArrayList<String> options2items02 = new ArrayList<>();
options2items02.add("长沙");
options2items02.add("岳阳");
options2items02.add("株洲");
options2items02.add("衡阳");
ArrayList<String> options2items03 = new ArrayList<>();
options2items03.add("桂林");
options2items03.add("玉林");
options2Items.add(options2items01);
options2Items.add(options2items02);
options2Items.add(options2items03);
2.一级菜单需要的实体类
/**
* @author Sai
* @date 15/11/22
*/
public class ProvinceBean implements IPickerViewData {
private long id;
private String name;
private String description;
private String others;
ProvinceBean(long id, String name, String description, String others) {
this.id = id;
this.name = name;
this.description = description;
this.others = others;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getOthers() {
return others;
}
public void setOthers(String others) {
this.others = others;
}
/**
* 这个用来显示在PickerView上面的字符串,PickerView会通过getPickerViewText方法获取字符串显示出来。
*
* @return name
*/
@Override
public String getPickerViewText() {
return name;
}
}
3.具体实现
private void sanjiliandong() {
OptionsPickerView pvOptions = new OptionsPickerView.Builder(this, new OptionsPickerView.OnOptionsSelectListener() {
@Override
public void onOptionsSelect(int options1, int options2, int options3, View v) {
//返回的分别是三个级别的选中位置
String tx = options1Items.get(options1).getPickerViewText()
+ options2Items.get(options1).get(options2)
/* + options3Items.get(options1).get(options2).get(options3).getPickerViewText()*/;
activityTimePickerTvTime.setText(tx);
}
})
.setTitleText("城市选择")
//设置滚轮文字大小
.setContentTextSize(20)
//设置分割线的颜色
.setDividerColor(Color.LTGRAY)
//默认选中项
.setSelectOptions(0, 1)
.setBgColor(Color.BLACK)
.setTitleBgColor(Color.DKGRAY)
.setTitleColor(Color.LTGRAY)
.setCancelColor(Color.YELLOW)
.setSubmitColor(Color.YELLOW)
.setTextColorCenter(Color.LTGRAY)
//是否只显示中间选中项的label文字,false则每项item全部都带有label。
.isCenterLabel(false)
.setLabels("省", "市", "区")
//设置外部遮罩颜色
.setBackgroundId(0x66000000)
.build();
//pvOptions.setSelectOptions(1,1);
/*pvOptions.setPicker(options1Items);//一级选择器*/
//二级选择器
pvOptions.setPicker(options1Items, options2Items);
/*pvOptions.setPicker(options1Items, options2Items,options3Items);//三级选择器*/
pvOptions.show();
}