修改DatePicker、 ?NumberPicker 默認屬性(間距、分割線顏色和高度)

1、基本使用

1、簡單使用

   <DatePicker
        android:startYear="2017"
        android:endYear="2018"
        android:calendarViewShown="false"
        android:spinnersShown="true"
        android:datePickerMode="spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
  • calendarViewShown:是否顯示ClendarView日歷組件
  • spinnersShown:是否顯示Spinner日期選擇組件
  • datePickerMode:有兩個值
  • calendar:日歷形式的日期選擇器
  • Spinner:滾動的
calendarViewShown="false",spinnersShown="true",使用日期組件
calendarViewShown="true",spinnersShown="true",使用日歷和日期組件
使用日歷組件

2、初始化datePicker

   private void initPicker() {
        //設置中文日歷
        calendar = Calendar.getInstance(Locale.CHINA);
        int year=calendar.get(Calendar.YEAR);
        int month=calendar.get(Calendar.MONTH);
        int day=calendar.get(Calendar.DAY_OF_MONTH);
        int week=calendar.get(Calendar.DAY_OF_WEEK);

        //初始化datePicker
        datePicker.init(year, month, day, new DatePicker.OnDateChangedListener() {
            @Override
            public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
    
            }
        });

        //設置最大日期
        GregorianCalendar g=new GregorianCalendar(year,month,day+7);
        datePicker.setMaxDate(g.getTimeInMillis());

    } 

3、初始化numberPicker

    private void initPicker() {
        ...
        //設置numberPicker展示的值,一個數組
        numberPicker.setDisplayedValues(times);
        //numberPicker的最小值
        numberPicker.setMinValue(0);
        //numberPicker的最大值
        numberPicker.setMaxValue(length-1);
        //numberPicker當前值
        numberPicker.setValue(preId);
    
        numberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

    }

3、設置NumberPicker,中間的EditView不可以點擊

中間不可點擊修改
        datePicker.setDescendantFocusability(DatePicker.FOCUS_BLOCK_DESCENDANTS);

4、設置NumberPicker,不能循環

        numPicker.setWrapSelectorWheel(false);

numberpicker的循環滾動需要遍歷所有元素,可能會導致的數組越界(當再次為numberpicker賦值時...)

2、獲得DatePicker的三個NumberPicker

DatePicker中選擇年月日的部分是三個NumberPicker,名字分別為mYearSpinner,mMonthSpinner、mDaySpinner,它們三個平鋪在一個LinearLayout中,可以通過如下方法得到這些NumberPicker:

  • 利用java反射技術得到DatePicker內部的屬性(三個NumberPicker),并對其進行操作(適用于API<21)
  • 可以通過三個NumberPicker的資源id,得到這些view(API>=21,這三個NumberPicker,不是DatePicker內部的屬性)。或者根據view樹的結構,得到NumberPicker
DatePicker
public class DatePicker extends FrameLayout {
    ...
    /**
     * A delegate implementing the basic DatePicker
     */
    private static class DatePickerSpinnerDelegate extends AbstractDatePickerDelegate {
        ...
        private final LinearLayout mSpinners;
        private final NumberPicker mDaySpinner;
        private final NumberPicker mMonthSpinner;
        private final NumberPicker mYearSpinner;
    }
}

代碼如下:


private void getNumberPicker() {
    Class<? extends DatePicker> c =DatePicker.class;
    Field fd = null, fm = null, fy = null;
    View daySpinner = null;
    View monthSpinner= null;
    View yearSpinner = null;
    // 系統版本大于5.0
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        //獲取資源的id
        int daySpinnerId = Resources.getSystem().getIdentifier("day", "id", "android");
        int monthSpinnerId = Resources.getSystem().getIdentifier("month", "id", "android");
        int yearSpinnerId = Resources.getSystem().getIdentifier("year", "id", "android");
        if (daySpinnerId != 0 && monthSpinnerId!=0 && yearSpinnerId!=0) {
            daySpinner = this.findViewById(daySpinnerId);
            monthSpinner = this.findViewById(monthSpinnerId);
            yearSpinner = this.findViewById(yearSpinnerId);
        }
            //或者
           /*LinearLayout llFirst = (LinearLayout) getChildAt(0);
            LinearLayout mSpinners = (LinearLayout) llFirst.getChildAt(0);
            for (int i = 0; i < mSpinners.getChildCount(); i++)
            {
                NumberPicker picker = (NumberPicker) mSpinners.getChildAt(i);
                mPickers.add(i, picker);
            }
            return;*/
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
        // 系統版本大于4.0
        fd = c.getDeclaredField("mDaySpinner");
        fm = c.getDeclaredField("mMonthSpinner");
        fy = c.getDeclaredField("mYearSpinner");
        if(fd!=null && fm!=null &&fy!=null){
            // 對字段獲取設置權限
            fd.setAccessible(true);
            fm.setAccessible(true);
            fy.setAccessible(true);
            // 得到對應的控件
            daySpinner = (View) fd.get(this);
            monthSpinner= (View) fm.get(this);
            yearSpinner= (View) fy.get(this);
        }
    } else {
        fd = c.getDeclaredField("mDayPicker");
        fm = c.getDeclaredField("mMonthPicker");
        fy = c.getDeclaredField("mYearPicker");
        if(fd!=null && fm!=null &&fy!=null){
            // 對字段獲取設置權限
            fd.setAccessible(true);
            fm.setAccessible(true);
            fy.setAccessible(true);
            // 得到對應的控件
            daySpinner = (View) fd.get(this);
            monthSpinner= (View) fm.get(this);
            yearSpinner= (View) fy.get(this);
        }
    }
    if (daySpinner != null && monthSpinner != null && yearSpinner != null) {
        daySpinner.setVisibility(View.GONE);
        if(daySpinner instanceof NumberPicker && monthSpinner instanceof NumberPicker && yearSpinner instanceof NumberPicker ){
            mPickers.add((NumberPicker) daySpinner);
            mPickers.add((NumberPicker) monthSpinner);
            mPickers.add((NumberPicker) yearSpinner);
        }
    }

}

注意:getIdentifier(String name, String defType, String defPackage) :獲取資源ID
資源的名稱 /資源的類型(drawable,string等) /包名

3、修改NumberPicker
 
    /**
     * 設置picker之間的間距
     */
    private void setPickerMargin(NumberPicker picker) {
        LinearLayout.LayoutParams p= (LinearLayout.LayoutParams) picker.getLayoutParams();
        p.setMargins(0,0,0,0);
        if(Build.VERSION.SDK_INT> Build.VERSION_CODES.JELLY_BEAN_MR1){
            p.setMarginStart(0);
            p.setMarginEnd(0);
        }
    }

    /**
     * 設置picker分割線的顏色
     */
    private void setDividerColor(NumberPicker picker) {
        Field field=NumberPicker.class.getDeclaredField("mSelectionDivider");
        if(field!=null){
            field.setAccessible(true);
            field.set(picker,new ColorDrawable(Color.RED));
        }
    }

    /**
     * 設置picker分割線的寬度
     */
    private void setNumberPickerDivider(NumberPicker picker) {
        Field[] fields=NumberPicker.class.getDeclaredFields();
        for(Field f:fields){
            if(f.getName().equals("mSelectionDividerHeight")){
                f.setAccessible(true);
                f.set(picker,1);
            break;
            }
        }
    }
修改前
修改后

參考:Android NumberPicker 修改分割線顏色和高度及字體顏色大小更改DatePicker中年月日的間隔和分隔線顏色

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,523評論 0 17
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,229評論 4 61
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,268評論 25 708
  • 南風蕭蕭吹散廣陵曲十年安然洛陽路胡塵又起惹離亂如故牧歌飄 交錯九州江湖 戰馬趨 再詠絮石頭城下波濤怒誰又堪 兵戈苦...
    夢飲千樽月閱讀 489評論 0 48
  • 麻煩問一下 大家 這個系統服務中的 時間與地點 流量是怎么產生的呢?我App中只是使用了CLLocationMan...
    wrlynxayy閱讀 198評論 0 0