0

I knew how to hide year or day in DatePickerDialog. Use reflect. But I found it didn't work on Month. I can't find field mMonthSpinner or mMonthPicker. It's very strange because I truly found them in source code.

    DatePicker datePicker = findDatePicker((ViewGroup) this.getWindow()
            .getDecorView());
    if (datePicker != null) {
        Class pickerClass = datePicker.getClass();
        Field[] fields = pickerClass.getDeclaredFields();
        for (Field field : fields) {
            String fieldName = field.getName();
            Log.d(tag,fieldName);
        }
    }

this code print log:

DATE_FORMAT

DEFAULT_CALENDAR_VIEW_SHOWN

DEFAULT_ENABLED_STATE

DEFAULT_END_YEAR

DEFAULT_SPINNERS_SHOWN

DEFAULT_START_YEAR

LOG_TAG

TW_DEBUG

productName

mYearSpinnerInput

mYearSpinner

mYearIncrementButton

mYearDecrementButton

mTempDate

mSpinners

mShortMonths

mCalendarView

mCurrentDate

mCurrentLocale

mDateFormat

mDayDecrementButton

mDayIncrementButton

mDaySpinner

So,you see, no month in there. Then how can I hide the month? My SDK is 4.4.2. Need Help!!!!!!!!!!

2 Answers2

0

I was also using that reflection method, but it doesn't work on Android 5. Here is my view traversal workaround, which I'm not proud of, but so far it works.

//First use the reflection search
try {
    Field monthPickerField = datePicker.getClass().getDeclaredField("mMonthSpinner");
    monthPickerField.setAccessible(true);
    monthSubPicker = (View) monthPickerField.get(datePicker);
} catch (Exception e) {
    //Reflection search went wrong
}
try {
    Field dayPickerField = datePicker.getClass().getDeclaredField("mDaySpinner");
    dayPickerField.setAccessible(true);
    daySubPicker = (View) dayPickerField.get(datePicker);
} catch (Exception e) {
    //Reflection search went wrong
}

//If nothing was found use the traversal of DataPicker layout
if (monthSubPicker == null) {
    //Result list
    ArrayList<NumberPicker> numberPickers = new ArrayList<NumberPicker>();
    searchViewGroupForSpinner(datePicker, numberPickers);
    //Use first two NumberPickers
    if (numberPickers.size() >= 2) {
        daySubPicker = numberPickers.get(0);
        monthSubPicker = numberPickers.get(1);
    }
}

The seachViewGroupForSpinner method recursively traverses layout of DatePicker and collects all instances of NumberPicker view.

private void searchViewGroupForSpinner(ViewGroup vg, List<NumberPicker> numberPickers) {
    for (int i = 0; i < vg.getChildCount(); i++) {
        View view = vg.getChildAt(i);
        if (view instanceof NumberPicker) {
            numberPickers.add((NumberPicker) view);
        } else if (view instanceof ViewGroup) {
            searchViewGroupForSpinner((ViewGroup) view, numberPickers);
        }
    }
}
Almighty
  • 835
  • 8
  • 16
0

Can hide "mDaySpinner", "mMonthSpinner"and "mYearSpinner". (This won't work for android 5.1)

private DatePickerDialog dpdHideField(DatePickerDialog datepickerDialog) {
    try {
        java.lang.reflect.Field[] datePickerDialogFields = datepickerDialog.getClass().getDeclaredFields();
        for (java.lang.reflect.Field datePickerDialogField : datePickerDialogFields) {

            if (datePickerDialogField.getName().equals("mDatePicker")) {
                datePickerDialogField.setAccessible(true);
                DatePicker datePicker = (DatePicker) datePickerDialogField.get(datepickerDialog);
                java.lang.reflect.Field[] datePickerFields = datePickerDialogField.getType().getDeclaredFields();
                for (java.lang.reflect.Field datePickerField : datePickerFields) {

                    if ("mDaySpinner".equals(datePickerField.getName()) || "mMonthSpinner".equals(datePickerField.getName()) || "DAY".equals(datePickerField.getName()) || "MONTH".equals(datePickerField.getName())) {
                        datePickerField.setAccessible(true);
                        Object dayPicker = datePickerField.get(datePicker);
                        ((View) dayPicker).setVisibility(View.GONE);
                    }
                }
            }
        }
    } catch (Exception ex) {
    }
    return datepickerDialog;
}
RDD
  • 145
  • 1
  • 18