How to display year only in date picker in android

前端 未结 6 1290
一整个雨季
一整个雨季 2020-12-03 21:59

Can anybody tell how to display year only in date picker in android

Thanks

6条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-03 22:14

    You could also use some simple reflection to hide the day and month NumberPickers of a DatePicker widget. Do note that this may stop working if Google decides to rename the member field names. Also, this approach of course makes sense when using android:datePickerMode="spinner".

    // inflate DatePicker, or e.g. get it from a DatePickerDialog:
    DatePicker datepicker = ...
    
    // pre-Honeycomb fields: 
    findAndHideField(datepicker, "mDayPicker");
    findAndHideField(datepicker, "mMonthPicker");
    
    // Honeycomb(+) fields:
    findAndHideField(datepicker, "mDaySpinner");
    findAndHideField(datepicker, "mMonthSpinner");
    
    // Lollipop(+) fields (wrapped in a delegate):
    final Object mDatePickerDelegate = findFieldInstance(picker, "mDelegate");
    findAndHideField(mDatePickerDelegate, "mDaySpinner");
    findAndHideField(mDatePickerDelegate, "mMonthSpinner");
    
    
    /** find a member field by given name and hide it */
    private static void findAndHideField(Object object, String name) {
        try {
            final Field field = object.getClass().getDeclaredField(name);
            field.setAccessible(true);
            final View fieldInstance = (View) field.get(object);
            fieldInstance.setVisibility(View.GONE);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /* find a member field by given name and return its instance value */
    private static Object findFieldInstance(DatePicker datepicker, String name) {
        try {
            final Field field = DatePicker.class.getDeclaredField(name);
            field.setAccessible(true);
            return field.get(datepicker);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    

    Update: Added code illustrating how to make this approach work with Android 'Lollipop' 5.0 (API 21+).


    Disclaimer: I cannot stress enough that this is hacky solution that may stop working with any framework update (as it did when Android 3.0 was first introduced, and again with Android 5.0).

提交回复
热议问题