Удалить год из DatePickerDialog


person kirktoon1882    schedule 19.04.2012    source источник
comment
Имейте в виду, что некоторые даты (29 февраля!) Могут быть, а могут и не быть действительными, в зависимости от года.   -  person    schedule 06.01.2013


Ответы (5)


Да, это возможно. DatePicker имеет встроенные три элемента управления NumberPicker, за которыми следуют год, месяц, день, скрыть первым.

final Calendar cal = Calendar.getInstance();
mDialog = new CustomerDatePickerDialog(getContext(), this,
cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),
cal.get(Calendar.DAY_OF_MONTH));
mDialog.show();
DatePicker dp = findDatePicker((ViewGroup) mDialog.getWindow().getDecorView());
if (dp != null) {
    ((ViewGroup) dp.getChildAt(0)).getChildAt(0).setVisibility(View.GONE);
} 

CustomerDatePickerDialog

class CustomerDatePickerDialog extends DatePickerDialog {
     public CustomerDatePickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) {
         super(context, callBack, year, monthOfYear, dayOfMonth);
     }

     @Override
     public void onDateChanged(DatePicker view, int year, int month, int day) {
         super.onDateChanged(view, year, month, day);
         mDialog.setTitle((month + 1) + "-" + day + "-");
     }
}

DatePicker:

private DatePicker findDatePicker(ViewGroup group) {
        if (group != null) {
            for (int i = 0, j = group.getChildCount(); i < j; i++) {
                View child = group.getChildAt(i);
                if (child instanceof DatePicker) {
                    return (DatePicker) child;
                } else if (child instanceof ViewGroup) {
                    DatePicker result = findDatePicker((ViewGroup) child);
                    if (result != null)
                        return result;
                }
            }
        }
        return null;

    } 
person ρяσѕρєя K    schedule 19.04.2012
comment
Я получаю сообщение об ошибке в новом CustomerDatePickerDialog (getContext (), this, .... в getContext (). И изменение его на getBaseContext () ухудшает ситуацию. Что здесь исправить? Одно из предложений Eclipse - создать метод getContext (), но это тоже усугубляет ситуацию. - person kirktoon1882; 04.05.2012
comment
Где вы используете getContext () в классе Activity? Вы должны передать туда контекст текущего Activity .. - person Cata; 06.01.2013
comment
Он не работает, я использовал его, но он скрывает все три прядильщика и просто показывает заголовок datepickerdialog, текущая ОС - 4.1.2, разве это не из-за зависимости ОС, нужна помощь, а также, если я хочу удалить день, а не год, как мне нужно изменить это - person Usman Kurd; 16.08.2013
comment
mDialog в CustomerDatePickerDialog, находится в ...? - person desgraci; 21.07.2014
comment
что здесь mdialog? - person ; 09.01.2015

Один лайнер:

getDatePicker().findViewById(Resources.getSystem().getIdentifier("year", "id", "android")).setVisibility(View.GONE);

При построении диалогового окна убедитесь, что вы выбрали високосный год (например, 1904), чтобы в календарь было включено 29 февраля:

        DatePickerDialog dialog = new DatePickerDialog(getContext(),
                listener,
                1904,
                month,
                dayOfMonth
        );
        dialog.show();
person vtlinh    schedule 08.06.2015
comment
Расчет на идентификаторы системы не годится. - person Leo supports Monica Cellio; 08.02.2018

Я не уверен, что если спрятать первого ребенка, это хорошая идея. Я протестировал это решение:

  1. Android 2.3 -> работает (счетчик дня пропал)
  2. Android 4.0 -> не работает, потому что есть еще один элемент (календарь) и первый счетчик - это не день, а месяц.

Лучшим решением может быть изменение исходного кода DatePicker на ваш собственный пакет.

person Agnieszka Zelezik    schedule 05.01.2013

Я считаю, что это намного лучшая реализация. Также обратите внимание на комментарий duskwuff к OP. Из-за этого дни могут отображаться неправильно.

date_picker

<?xml version="1.0" encoding="utf-8"?>
<DatePicker xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/datePickerNoYear"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

CustomDatePickerDialog.java

public class DatePickerDialogNoYear extends DatePickerDialog {
    public DatePickerDialogNoYear(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) {
        super(context, callBack, year, monthOfYear, dayOfMonth);
        hideYear();
    }

    public DatePickerDialogNoYear(Context context, int theme, OnDateSetListener listener, int year, int monthOfYear, int dayOfMonth) {
        super(context, theme, listener, year, monthOfYear, dayOfMonth);
        hideYear();
    }

    @Override
    public void setView(View view, int viewSpacingLeft, int viewSpacingTop, int viewSpacingRight, int viewSpacingBottom) {
        view = findViewById(R.id.datePickerNoYear);
        super.setView(view, viewSpacingLeft, viewSpacingTop, viewSpacingRight, viewSpacingBottom);
    }

    private void hideYear() {
        try {
            Field f[] = this.getClass().getDeclaredFields();
            for (Field field : f) {
                if (field.getName().equals("mYearPicker")) {
                    field.setAccessible(true);
                    ((View) field.get(this)).setVisibility(View.GONE);
                }
            }
        } catch (SecurityException | IllegalArgumentException | IllegalAccessException e) {
            Log.d("ERROR", e.getMessage());
        }
    }
}

Тогда просто используйте его как любой другой DatePickerDialog. Удачи!

person Chad Bingham    schedule 24.12.2014

В этой ветке у вас есть очень простое решение (больше, чем в предыдущем), я пробую его сейчас и отлично работает.

Скрыть поле года в Android DatePicker?

person Sergio    schedule 06.02.2013