PickerView的使用(时间选择器)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38703938/article/details/82877444

前段时间,因业务整合,有个需求是把原来可以选择年月日的弹窗改为仅选择年月。

前期思路

重写原生的DatePickerDialog,设置DatePickerDialog的样式为年月日为滑动选择,隐藏日的选择,实现功能。

代码如下:

import android.app.DatePickerDialog;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.DatePicker;

/**
 * @version: v1.0
 * @description: 只选择年月的时间选择控件
 * @package: com.aisino.wsbs.ahgs_wsbs.common.dialog
 * @author: 酥小鱼
 * @date :2018/9/18
 */

public class YearMonthDatePickerDialog extends DatePickerDialog {
    public YearMonthDatePickerDialog(Context context, int theme, OnDateSetListener callBack,
                                     int year, int monthOfYear, int dayOfMonth) {
        //主题样式最好是指定的样式,比如这样的样式:DatePickerDialog.THEME_HOLO_LIGHT,因为在小米手机中会显示不同的弹窗日期样式甚至有的会报错崩溃
        super(context, DatePickerDialog.THEME_HOLO_LIGHT, callBack, year, monthOfYear, dayOfMonth);
        setTitle(year + "年" + (monthOfYear + 1) + "月");
        try {
            ((ViewGroup) ((ViewGroup) (getDatePicker().getChildAt(0))).getChildAt(0)).getChildAt(2)
                    .setVisibility(View.GONE);
        }catch (Exception e){
            e.printStackTrace();
        }

    }

    public YearMonthDatePickerDialog(Context context, OnDateSetListener callBack, int year,
                                     int monthOfYear, int dayOfMonth) {
        super(context, callBack, year, monthOfYear, dayOfMonth);
    }

    @Override
    public void onDateChanged(DatePicker view, int year, int month, int day) {
        super.onDateChanged(view, year, month, day);
        setTitle(year + "年" + (month + 1) + "月");
    }
}

具体使用:

//获取当前日期
                Calendar calendar = Calendar.getInstance();
                year = calendar.get(Calendar.YEAR);
                month = calendar.get(Calendar.MONTH);
                day = calendar.get(Calendar.DAY_OF_MONTH);
                YearMonthDatePickerDialog dpd = new YearMonthDatePickerDialog(NewFpyjActivity.this
                        , 3, dateListener, year, month, day);
                dpd.show();
    /**
     * 定义日期的监听
     */
    private DatePickerDialog.OnDateSetListener dateListener = new DatePickerDialog.OnDateSetListener() {
        /**params:view:该事件关联的组件
         * params:myyear:当前选择的年
         * params:monthOfYear:当前选择的月
         * params:dayOfMonth:当前选择的日
         */
        @Override
        public void onDateSet(DatePicker view, int myyear, int monthOfYear, int dayOfMonth) {
            //修改year、month、day的变量值,以便以后单击按钮时,DatePickerDialog上显示上一次修改后的值
            year = myyear;
            month = monthOfYear + 1;
            day = dayOfMonth;
            if (month > 9){
                txtNewKprq.setText(year + "-" + month);
                txtNewKprq.setTextColor(getResources().getColor(R.color.fpyj_bszn_text_color));
            }else {
                txtNewKprq.setText(year + "-0" + month);
                txtNewKprq.setTextColor(getResources().getColor(R.color.fpyj_bszn_text_color));
            }

        }
    };

简单解释下以上代码:那个判断月份是因为没有将得到的日期进行格式化(后期我进行了优化,private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");  sdf.format(date)即可),因为这个选择框选择的数据如果是2018.9.28,返回的是2018-9,我需要的是2018-09

遇到的坑

一切ok,调整为滑动选择年月的弹窗样式,我拿自己手机进行了测试,弹出的仍然是点击选择的样式弹窗,因为我手机是7.0的系统,而且是小米手机,不确定问题所在,拿其他手机测试了一下,最终确定是小米手机的坑(国内的定制很坑爹),因为拿华为手机,无论是6.0还是8.0都很nice,实现功能和效果。很烦,指定了一下样式,并没有解决问题。如果你知道怎么解决,欢迎告诉我。

最终解决办法

换了个坑,不想太麻烦的重写,就只能找现有的轮子了,选择了PickerView

GitHub地址:https://github.com/Bigkoo/Android-PickerView

具体使用(代码如下):

    private void showDatePicker() {
        Calendar selectedDate = Calendar.getInstance();
        Calendar startDate = Calendar.getInstance();
        //startDate.set(2013,1,1);
        Calendar endDate = Calendar.getInstance();
        //endDate.set(2020,1,1);

        //正确设置方式 原因:注意事项有说明
        startDate.set(2013, 0, 1);
        endDate.set(2020, 11, 31);

        TimePickerView pvTime = new TimePickerBuilder(this, new OnTimeSelectListener() {
            @Override
            public void onTimeSelect(Date date, View v) {//选中事件回调
                txtNewKprq.setText(sdf.format(date));
                txtNewKprq.setTextColor(getResources().getColor(R.color.fpyj_bszn_text_color));
            }
        })
                .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
                .setCancelText("取消")//取消按钮文字
                .setSubmitText("确认")//确认按钮文字
                .setTitleSize(20)//标题文字大小
                .setTitleText("")//标题文字
                .setOutSideCancelable(true)//点击屏幕,点在控件外部范围时,是否取消显示
                .isCyclic(true)//是否循环滚动
                .setTitleColor(Color.BLACK)//标题文字颜色
                .setSubmitColor(getResources().getColor(R.color.fpyj_second_phase_color))//确定按钮文字颜色
                .setCancelColor(getResources().getColor(R.color.fpyj_second_phase_color))//取消按钮文字颜色
                .setTitleBgColor(Color.WHITE)//标题背景颜色 Night mode
                .setBgColor(Color.WHITE)//滚轮背景颜色 Night mode
                .setDate(selectedDate)// 如果不设置的话,默认是系统时间*/
                .setRangDate(startDate, endDate)//起始终止年月日设定
                .setLabel("年", "月", "日", "时", "分", "秒")//默认设置为年月日时分秒
                .isCenterLabel(false) //是否只显示中间选中项的label文字,false则每项item全部都带有label。
                .isDialog(true)//是否显示为对话框样式
                .build();

        pvTime.show();
    }

这个注释写的很清楚明白,具体可参照GitHub,内容已经很详细了。

写在最后

欢迎访问交流群:589780530

猜你喜欢

转载自blog.csdn.net/weixin_38703938/article/details/82877444