DatePicker隱藏“天”選擇

最近使用了DatePicker 這個控件,採用的是往上又一次分裝的這種,就是兩個卡片切換選擇年月日和時間。

有一個需求時這個選擇器不顯示出來“天”的這個選項。查資料發現,有人做了實現,具體代碼還沒弄清楚,可以研究DatePicker源碼,這裏主要是根據反射原理獲取到DatePicker中的一些域,同時代碼獲取到佈局,然後在進行操作,如:修改分割線顏色,隱藏某一個域等。這裏做一個記錄,方便後續使用。

創建對象是調用方法:

 /**
     * 隱藏“天”
     * @param mDatePicker
     */
    private void hideDay(DatePicker mDatePicker) {
        try {
            /* 處理android5.0以上的特殊情況 */
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                int daySpinnerId = Resources.getSystem().getIdentifier("day", "id", "android");
                if (daySpinnerId != 0) {
                    View daySpinner = mDatePicker.findViewById(daySpinnerId);
                    if (daySpinner != null) {
                        daySpinner.setVisibility(View.GONE);
                    }
                }
            } else {
                Field[] datePickerfFields = mDatePicker.getClass().getDeclaredFields();
                for (Field datePickerField : datePickerfFields) {
                    if ("mDaySpinner".equals(datePickerField.getName()) || ("mDayPicker").equals(datePickerField.getName())) {
                        datePickerField.setAccessible(true);
                        Object dayPicker = new Object();
                        try {
                            dayPicker = datePickerField.get(mDatePicker);
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        } catch (IllegalArgumentException e) {
                            e.printStackTrace();
                        }
                        ((View) dayPicker).setVisibility(View.GONE);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

這個方法就可以完成需求的操作。由此方法也能衍生出“月”,“年”等不同項的操作,這幾個操作沒有詳細瞭解,待後續研究。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        int daySpinnerId = Resources.getSystem().getIdentifier("day", "id", "android");
        if (daySpinnerId != 0) {
            View daySpinner = dp_mes.findViewById(daySpinnerId);
            if (daySpinner != null) {
                daySpinner.setVisibility(View.GONE);
            }
        }

        int monthSpinnerId = Resources.getSystem().getIdentifier("month", "id", "android");
        if (monthSpinnerId != 0) {
            View monthSpinner = dp_mes.findViewById(monthSpinnerId);
            if (monthSpinner != null) {
                monthSpinner.setVisibility(View.VISIBLE);
            }
        }

        int yearSpinnerId = Resources.getSystem().getIdentifier("year", "id", "android");
        if (yearSpinnerId != 0) {
            View yearSpinner = dp_mes.findViewById(yearSpinnerId);
            if (yearSpinner != null) {
                yearSpinner.setVisibility(View.GONE);
            }
        }
    } else { //Older SDK versions
        Field f[] = dp_mes.getClass().getDeclaredFields();
        for (Field field : f) {
            if (field.getName().equals("mDayPicker") || field.getName().equals("mDaySpinner")) {
                field.setAccessible(true);
                Object dayPicker = null;
                try {
                    dayPicker = field.get(dp_mes);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                ((View) dayPicker).setVisibility(View.GONE);
            }

            if (field.getName().equals("mMonthPicker") || field.getName().equals("mMonthSpinner")) {
                field.setAccessible(true);
                Object monthPicker = null;
                try {
                    monthPicker = field.get(dp_mes);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                ((View) monthPicker).setVisibility(View.VISIBLE);
            }

            if (field.getName().equals("mYearPicker") || field.getName().equals("mYearSpinner")) {
                field.setAccessible(true);
                Object yearPicker = null;
                try {
                    yearPicker = field.get(dp_mes);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                ((View) yearPicker).setVisibility(View.GONE);
            }
        }
    }
}


選擇器連接:https://github.com/jjobes/SlideDateTimePicker

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章