PickerView的使用(時間選擇器)
阿新 • • 發佈:2018-12-12
前段時間,因業務整合,有個需求是把原來可以選擇年月日的彈窗改為僅選擇年月。
前期思路
重寫原生的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