每天记录学习的新知识: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 一个简单的小例子:
每天记录学习的新知识:PickerView 时间选择器

    @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 重新定义样式的时间选择器
每天记录学习的新知识:PickerView 时间选择器

   /**
     * 选择出生年月日
     * 控制时间范围(如果不设置范围,则使用默认时间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. 多级联动

每天记录学习的新知识:PickerView 时间选择器

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();
    }