0

我知道如何在 DatePickerDialog 中隐藏年份或日期。使用反射。但我发现它在月份不起作用。我找不到字段 mMonthSpinner 或 mMonthPicker。这很奇怪,因为我真的在源代码中找到了它们。

    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);
        }
    }

此代码打印日志:

日期格式

DEFAULT_CALENDAR_VIEW_SHOWN

DEFAULT_ENABLED_STATE

DEFAULT_END_YEAR

DEFAULT_SPINNERS_SHOWN

DEFAULT_START_YEAR

LOG_TAG

TW_DEBUG

产品名称

mYearSpinnerInput

mYearSpinner

我的年增量按钮

mYearDecrementButton

mTempDate

mSpinners

mShortMonths

mCalendarView

mCurrentDate

mCurrentLocale

日期格式

mDayDecrementButton

mDayIncrementButton

mDaySpinner

所以,你看,那里没有一个月。那么如何隐藏月份呢?我的 SDK 是 4.4.2。需要帮忙!!!!!!!!!!

4

2 回答 2

0

我也在使用这种反射方法,但它在 Android 5 上不起作用。这是我的视图遍历解决方法,我并不为此感到自豪,但到目前为止它有效。

//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);
    }
}

seachViewGroupForSpinner方法递归地遍历视图的布局DatePicker并收集所有NumberPicker视图实例。

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);
        }
    }
}
于 2015-02-16T21:51:09.360 回答
0

可以隐藏“mDaySpinner”、“mMonthSpinner”和“mYearSpinner”。(这不适用于 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;
}
于 2015-09-02T06:04:27.717 回答