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

このコードはログを出力します:

DATE_FORMAT

DEFAULT_CALENDAR_VIEW_SHOWN

DEFAULT_ENABLED_STATE

DEFAULT_END_YEAR

DEFAULT_SPINNERS_SHOWN

DEFAULT_START_YEAR

LOG_TAG

TW_DEBUG

商品名

mYearSpinnerInput

ミイヤースピナー

mYearIncrementButton

mYearDecrementButton

mTempDate

mSpinners

mShortMonths

mCalendarView

mCurrentDate

mCurrentLocale

mDateFormat

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 に答える