前言
我知道現在github上有很多功能強大的各色選擇器,但是Android其實是自帶一些時間選擇器的。在不需要太復雜的ui開發下可以選擇使用這些系統自帶的。android系統自帶時間控件:
- DatePicker 日期顯示控件
- DatePickerDialog 日期對話框控件
- TimePicker 時間顯示控件
- TimePickerDialog 時間對話框控件
講解TimePicker選擇器的一些自定義設置
首先是布局的創建:
<TimePicker android:id="@+id/timepicker" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:background="#ffffff" />
設置TimePicker選擇器風格
TimePicker 本身自帶兩種風格,都可以在xml中設置,一種是
android:timePickerMode="clock"

另一種是:
android:timePickerMode="spinner"

TimePicker的顯示規模大小設置
android:scaleX="2"
android:scaleY="2"
效果:

TimePicker的數據回調
mTimepicker = (TimePicker) inflate.findViewById(R.id.timepicker); mTimepicker.setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS); //設置點擊事件不彈鍵盤 mTimepicker.setIs24HourView(true); //設置時間顯示為24小時 mTimepicker.setHour(8); //設置當前小時 mTimepicker.setMinute(10); //設置當前分(0-59) mTimepicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { //獲取當前選擇的時間 @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { } });
利用反射修改一些選擇器的字體效果與背景顏色
需要用到反射的方法了,比如更改分割線的樣式,設置起始截止時間等:
首先我們要通過反射獲取TimePicker源碼里hour和minute的id:
Resources systemResources = Resources.getSystem(); int hourNumberPickerId = systemResources.getIdentifier("hour", "id", "android"); int minuteNumberPickerId = systemResources.getIdentifier("minute", "id", "android");
然后用我們定義的TimePicker來獲取這個id並轉換成hour和minute對應的NumberPicker:
NumberPicker hourNumberPicker = (NumberPicker) mTimepicker.findViewById(hourNumberPickerId);
NumberPicker minuteNumberPicker = (NumberPicker) mTimepicker.findViewById(minuteNumberPickerId);
通過獲取到的hourNumberPicker和minuteNumberPicker我們可以先進行TimePicker的時間限制:
hourNumberPicker.setMinValue(8); //設置最小hour hourNumberPicker.setMaxValue(12); //設置最大hour minuteNumberPicker .setMinValue(0); //設置最小minute minuteNumberPicker .setMaxValue(30); //設置最大minute
修改滾動條背景顏色
hourNumberPicker.setBackgroundColor(getResources().getColor(R.color.colorBlue));// 修改背景顏色
效果圖:

隱藏冒號
用最暴力的方式隱藏滾動條的冒號,就是直接找ChildAt
ViewGroup view = (ViewGroup) mTimepicker.getChildAt(0); ViewGroup view2 = (ViewGroup) view.getChildAt(1); view2.getChildAt(1).setVisibility(View.GONE);
禁止鍵盤輸入
mTimePicker.setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS);
TimePicker分割線的顏色和高度
private void setNumberPickerDivider(NumberPicker numberPicker) { NumberPicker picker = numberPicker; Field[] pickerFields = NumberPicker.class.getDeclaredFields(); for (Field pf : pickerFields) { if (pf.getName().equals("mSelectionDivider")) { //設置顏色 pf.setAccessible(true); ColorDrawable colorDrawable = new ColorDrawable( ContextCompat.getColor(this, R.color.colortime)); //選擇自己喜歡的顏色 try { pf.set(numberPicker, colorDrawable); } catch (IllegalAccessException e) { e.printStackTrace(); } } if (pf.getName().equals("mSelectionDividerHeight")) { //設置高度 pf.setAccessible(true); try { int result = 3; //要設置的高度 pf.set(picker, result); } catch (Exception e) { e.printStackTrace(); } break; } picker.invalidate(); } }
