Android專案總結(二)仿IOS效果的日期選擇器和省市縣三級聯動

依然範特稀西發表於2017-11-13

離第一篇專案總結《Android 專案總結(1)- 之弧形ViewPager 和弧形HeaderView》過了一週多的時間了,趁今天週末有時間為大家帶來第二篇:專案中用到的選擇器。

一、需求

在我們的開發過程中,可能會遇到這樣的需求:給定使用者幾個選項或者讓使用者從某個範圍內選擇需要的值,而不需要使用者自己去手動輸入。典型的場景如:電商APP的收貨地址,使用者選擇省市縣。填寫生日的時候,使用者選擇年月日,或者其他一些數值得選擇等等。正好最近專案中有類似的功能,因此在此總結記錄總結一下。

專案中用到的幾個場景:

1,年月日的選擇

2,省市區三級聯動

3,時間選擇

4,數值選擇

二、選擇器PickerView

如果你需要一個時間選擇器或者省市縣三級聯動的控制元件,隨便一google ,出來一大把,但是正真能用好用的不多,今天就為大家推薦一個所用到的開源控制元件Android-PikerView, 它基本上能滿足你專案中所有的選擇:年月日時間選擇、二級聯動、三級聯動、在給定列表中選擇等。

Github 地址:github.com/Bigkoo/Andr…

有如下功能:

  • 支援三級聯動
  • 設定是否聯動
  • 設定迴圈模式
  • 支援自定義佈局。
  • 支援item的分隔線設定。
  • 支援item間距設定。
  • 時間選擇器支援起始和終止日期設定。
  • 支援“年,月,日,時,分,秒”,“省,市,區”等選項的單位(label)顯示、隱藏和自定義。
  • 支援自定義文字、顏色、文字大小等屬性
  • Item的文字長度過長時,文字會自適應縮放到Item的長度,避免顯示不完全的問題
  • 支援Dialog 模式。
  • 支援自定義設定容器。

PickerView 中有兩種選擇器:

  • 選擇時間和日期的選擇器:TimePickerView
  • 選擇給定範圍或者給定選項的選擇器、二級和三級聯動的選擇器:OptionsPickerView

使用很簡單,採用構造器模式,可配置項很多,可以根據自己的需求來配置,如下:

 pvTime = new TimePickerView.Builder(this, new TimePickerView.OnTimeSelectListener() {
            @Override
            public void onTimeSelect(Date date,View v) {//選中事件回撥
                tvTime.setText(getTime(date));
            }
        })
                .setType(new boolean[]{true, true, true, true, true, true})// 預設全部顯示
                .setCancelText("Cancel")//取消按鈕文字
                .setSubmitText("Sure")//確認按鈕文字
                .setContentSize(18)//滾輪文字大小
                .setTitleSize(20)//標題文字大小
                .setTitleText("Title")//標題文字
                .setOutSideCancelable(false)//點選螢幕,點在控制元件外部範圍時,是否取消顯示
                .isCyclic(true)//是否迴圈滾動
                .setTitleColor(Color.BLACK)//標題文字顏色
                .setSubmitColor(Color.BLUE)//確定按鈕文字顏色
                .setCancelColor(Color.BLUE)//取消按鈕文字顏色
                .setTitleBgColor(0xFF666666)//標題背景顏色 Night mode
                .setBgColor(0xFF333333)//滾輪背景顏色 Night mode
                .setDate(selectedDate)// 如果不設定的話,預設是系統時間*/
                .setRangDate(startDate,endDate)//起始終止年月日設定
                .setLabel("年","月","日","時","分","秒")//預設設定為年月日時分秒
                .isCenterLabel(false) //是否只顯示中間選中項的label文字,false則每項item全部都帶有label。
                .isDialog(true)//是否顯示為對話方塊樣式
                .build();複製程式碼

三、專案實踐

1,年月日的選擇

程式碼如下:

 TimePickerView pvTime = new TimePickerView.Builder(this, new TimePickerView.OnTimeSelectListener() {
            @Override
            public void onTimeSelect(Date date, View v) {
                Calendar calendar = Calendar.getInstance();
                calendar.setTime(date);
                mTextViewYear.setText(calendar.get(Calendar.YEAR) + "");
                mTextViewMonth.setText(calendar.get(Calendar.MONTH) + 1 + "");// 月份比實際的月份少1個月
                mTextViewDay.setText(calendar.get(Calendar.DAY_OF_MONTH) + "");

                mBirthday = DateUtils.getDateString(date);
                Log.e("TAG", "birth:" + mBirthday);
            }

        })
                .isCenterLabel(false)
                .setType(new boolean[]{true, true, true, false, false, false})
                .setDate(selectedDate)
                .setRangDate(startDate, endDate)
                .setTitleText("出生")
                .setBgColor(Color.parseColor("#F6F7F6"))
                .setTitleSize(getResources().getColor(R.color.text_color_333))
                .setSubmitColor(getResources().getColor(R.color.text_color_main))
                .setCancelColor(getResources().getColor(R.color.text_color_999))
                .build();

        pvTime.show();複製程式碼

效果如下:

year_select
year_select

TimePickerView可以選擇開始日期、結束日期和彈出來時候預設選擇的日期,很方便。

2 ,省市縣三級聯動

程式碼如下:

 private void showPickerView() {// 彈出選擇器

        OptionsPickerView pvOptions = new OptionsPickerView.Builder(this, new OptionsPickerView.OnOptionsSelectListener() {
            @Override
            public void onOptionsSelect(int options1, int options2, int options3, View v) {
                //返回的分別是三個級別的選中位置
                mProvince = mProvinceBean.options1Items.get(options1).getPickerViewText();
                mCity = mProvinceBean.options2Items.get(options1).get(options2);
                mArea = mProvinceBean.options3Items.get(options1).get(options2).get(options3);

                setProvinceText();

            }
        })

                .setTitleText("城市選擇")
                .setDividerColor(Color.GRAY)
                .setTextColorCenter(Color.BLACK) //設定選中項文字顏色
                .setContentTextSize(20)
                .setBgColor(Color.parseColor("#F6F7F6"))
                .setTitleSize(getResources().getColor(R.color.text_color_333))
                .setSubmitColor(getResources().getColor(R.color.text_color_main))
                .setCancelColor(getResources().getColor(R.color.text_color_999))
                .build();

        pvOptions.setPicker(mProvinceBean.options1Items, mProvinceBean.options2Items, mProvinceBean.options3Items);//三級選擇器
        pvOptions.show();
    }複製程式碼

效果如下:

province_select3
province_select3

3,時間選擇

程式碼如下:

 protected void showTimePicker(TimePickerView.OnTimeSelectListener listener) {
        if (mTimePicker != null) {
            mTimePicker.show();
            return;
        }
        Calendar selectedDate = Calendar.getInstance();
        Calendar startDate = Calendar.getInstance();
        Calendar endDate = Calendar.getInstance();
        //正確設定方式 原因:注意事項有說明
        selectedDate.set(1990, 0, 1);
        startDate.set(1949, 0, 1);
        // 獲取當前的年、月、日
        endDate.setTimeInMillis(System.currentTimeMillis());
        mTimePicker = new TimePickerView.Builder(this, listener)
                .isCenterLabel(false)
                .setType(new boolean[]{false, false, false, true, true, false})
                .setDate(selectedDate)
                .setRangDate(startDate, endDate)
                .setTitleText("測量時間")
                .setBgColor(Color.parseColor("#F6F7F6"))
                .setTitleSize(getResources().getColor(R.color.text_color_333))
                .setSubmitColor(getResources().getColor(R.color.text_color_main))
                .setCancelColor(getResources().getColor(R.color.text_color_999))
                .build();
        mTimePicker.show();

    }複製程式碼

效果如下:

time_select
time_select

4, 數值選擇

程式碼如下:

 mOptionsPickerView = createHighBasePicker(title, new OptionsPickerView.OnOptionsSelectListener() {
            @Override
            public void onOptionsSelect(int options1, int options2, int options3, View v) {
                mBsValue = datas.get(options1).bs;
                mItemBloodSugar.setContent(mBsValue + "");
                mStatusView.setBSValue(mBsValue);
            }
        });
        mOptionsPickerView.setPicker(datas);
        mOptionsPickerView.show();


//createHighBasePicker 方法如下:
  protected OptionsPickerView createHighBasePicker(String title, OptionsPickerView.OnOptionsSelectListener listener) {
        OptionsPickerView picker = new OptionsPickerView.Builder(this, listener)
                .setTitleText(title)
                .setBgColor(Color.parseColor("#F6F7F6"))
                .setTitleSize(getResources().getColor(R.color.text_color_333))
                .setSubmitColor(getResources().getColor(R.color.text_color_main))
                .setCancelColor(getResources().getColor(R.color.text_color_999))
                .build();
        return picker;
    }複製程式碼

效果如下:

value_select
value_select

三、總結

以上就是專案中用到的幾種場景,當然了,功能還不止於此,還有一些二級聯動和自定義樣式的功能沒有演示,需要的同學可以去Github 主頁看相關介紹,或者去Demo裡面檢視各種選擇器的用法。總的來說是一個很不錯的開源專案,接近6k star。有需要的同學快去試一下吧!

更多幹貨文章,關注公眾號:

Android技術雜貨鋪.jpg
Android技術雜貨鋪.jpg

相關文章