Премахнете годината от DatePickerDialog

Използвам основния урок за DatePickerDialog от Android, който се намира тукAndroid Date Picker

и го накарах да работи. Но искам само да мога да избера дата от тази година. И така, има ли начин да премахнете годината от диалоговия прозорец, така че да се показват само месецът и денят? Всеки път, когато се опитам да извадя Year int, той нарушава кода.


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

Диалогов прозорец за избор на клиентска дата

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

Избор на дата:

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
Получавам грешка при new CustomerDatePickerDialog(getContext(), this,.... at getContext(). и промяната му на getBaseContext() го прави още по-лошо. Какво би било решението тук? ЕДНО предложение от Eclipse е да се създаде метод getContext(), но това го прави още по-лош. - person kirktoon1882; 04.05.2012
comment
Къде използвате 'getContext()' в клас 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 -> работи (day spinner го няма)
  2. Android 4.0 -> не работи, защото има още един елемент (календар) и първият от спинерите не е ден, а месец.

По-добро решение може да бъде модифицирането на изходния код на DatePicker към вашия собствен пакет

person Agnieszka Zelezik    schedule 05.01.2013

Чувствам, че това е много по-добро изпълнение. Също така, разгледайте коментара на duskwuff относно OP. Това може да накара дните да не се показват правилно.

избор на дата

<?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