1. 程式人生 > >PickerView的使用(時間選擇器)

PickerView的使用(時間選擇器)

前段時間,因業務整合,有個需求是把原來可以選擇年月日的彈窗改為僅選擇年月。

前期思路

重寫原生的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

具體使用(程式碼如下):

    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