Подтвердить что ты не робот

Установить лимит на DatePickerDialog в Android?

Как ограничить DatePickerDialog, чтобы выбрать дату с 2-12 лет в прошлом или от 0 до 2 лет с текущей даты?

У меня есть DatePickerDialog в действии, который используется для получения даты рождения для ребенка и младенца. Детский возраст будет (2-12 лет), а младенческий возраст может быть (0-2ys). Если я пройду 1, тогда возрастной предел должен быть (2-12yrs), и если я пройду 2, возрастный лимит должен быть (0-2yrs).

Что я могу сделать, чтобы получить эту функциональность в моем календаре?

Мой код календаря:

date = new DatePickerDialog.OnDateSetListener() {

            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear,
                    int dayOfMonth) {
                // TODO Auto-generated method stub
                myCalendar.set(Calendar.YEAR, year);
                myCalendar.set(Calendar.MONTH, monthOfYear);
                myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
                String myFormat = "dd/MM/yy"; //In which you need put here
                SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
                dateofBirth.setText(sdf.format(myCalendar.getTime()));
            }
        };

dateofBirth.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                showDialog(DATE_DIALOG_ID);

            }
        });

public Dialog onCreateDialog(int id) {
    final Calendar now = Calendar.getInstance();

    switch (id) {
    case DATE_DIALOG_ID:
        // set date picker as current date
        DatePickerDialog _date =   new DatePickerDialog(this, date,myCalendar
                .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                myCalendar.get(Calendar.DAY_OF_MONTH)){
            @Override

            public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth){   

                if (year > now.get(Calendar.YEAR))

                    view.updateDate(myCalendar
                            .get(Calendar.YEAR), myCalendar
                            .get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));

                if (monthOfYear > now.get(Calendar.MONTH) && year == now.get(Calendar.YEAR))
                    view.updateDate(myCalendar
                            .get(Calendar.YEAR), myCalendar
                            .get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));

                if (dayOfMonth > now.get(Calendar.DAY_OF_MONTH) && year == now.get(Calendar.YEAR) && 
                        monthOfYear == now.get(Calendar.MONTH))
                    view.updateDate(myCalendar
                            .get(Calendar.YEAR), myCalendar
                            .get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));
            }

        };

        return _date;
    }
    return null;
}
4b9b3361

Ответ 1

Все остальные ответы кажутся довольно запутанными, поэтому я просто хочу сказать очевидное: вы можете получить базовый DatePicker от DatePickerDialog (просто позвонив getDatePicker()) и установите его границы, используя:

Если аргумент является обычным числом миллисекунд с 1 января 1970 года 00:00:00 в часовом поясе по умолчанию. Конечно, вам все равно придется вычислять эти значения, но это должно быть тривиально с классом Calendar: просто возьмите текущую дату и добавьте или сравните x years.

Более внимательный читатель заметит, что вышеупомянутые сеттеры были недоступны до уровня API 11. Если вы ориентируетесь только на эту (или более новую) платформу, тогда вам хорошо идти. Если вы также хотите поддерживать, например, устройства Gingerbread (Android 2.3/API уровня 9+), вместо него можно использовать резервную версию DatePicker.

Ответ 2

Установка минимальной и максимальной даты для DatePickerDialog недостаточно. Пользователь может нажать на год и прокручиваться между годами.

Вы также должны установить диапазон года для DatePicker следующим образом:

datePicker.setYearRange(calendar.get(Calendar.YEAR), calendar.get(Calendar.YEAR) + 1);

Ответ 3

У меня другая проблема.

Я использую два входных текста и два DatePickerDialog, и мне нужно обновить второе действие, выбранное в первом диалоговом окне datepicker, но так как это я выбрал в первом диалоговом окне, minDate во втором диалоге не обновляется.

Ссылка:

Дата установки SetMax до 30 дней в Android Date Picker

Теперь, прямо внизу, инициируйте переменные:

private static final int DEPARTUREDATE_DIALOG_ID = 0;
private static final int RETURNDATE_DIALOG_ID = 1;

private long mMinReturnDate;
private int year_x, month_x, day_x;

Ниже, значения по умолчанию и minDate первого диалога datePicker:

// onCreate setValues() method.
DateFormat dateFormat = new SimpleDateFormat("EE, dd MMM yyyy", Locale.getDefault());

Calendar calendar = Calendar.getInstance();

year_x = calendar.get(Calendar.YEAR);
month_x = calendar.get(Calendar.MONTH);
day_x = calendar.get(Calendar.DAY_OF_MONTH);

String departureDatetime = dateFormat.format(calendar.getTime());
mDepartureDate.setText(departureDatetime);

// Determine min date to select in calendar.
mMinReturnDate = calendar.getTimeInMillis();

calendar.add(Calendar.DATE, 1);

String returnDatetime = dateFormat.format(calendar.getTime());
mReturnDate.setText(returnDatetime);

onCreateDialog метод:

protected Dialog onCreateDialog(int id) {
    super.onCreateDialog(id);

    if (id == DEPARTUREDATE_DIALOG_ID)
        return showCalendarFromDepartureDate(mContext, year_x, month_x, day_x);

    else if (id == RETURNDATE_DIALOG_ID)
        return showCalendarFromReturnDate(mContext, year_x, month_x, day_x);

    return null;
}

Ниже метода showCalendarFromDepartureDate:

Здесь я сделал код, чтобы обновить minDate второго диалога datepicker, когда я выбираю первый диалог.

/**
 * Show calendar from departure date.
 *
 * @param context
 * @param year
 * @param month
 * @param day
 * @return
 */
protected DatePickerDialog showCalendarFromDepartureDate(Context context, int year, int month, int day) {
    Calendar now = Calendar.getInstance();

    DatePickerDialog dialog = new DatePickerDialog(context, departureDatePickerLstner, year, month, day);
    dialog.getDatePicker().setMinDate(now.getTimeInMillis());

    return dialog;
}

private DatePickerDialog.OnDateSetListener departureDatePickerLstner = new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        DateFormat dateFormat = new SimpleDateFormat("EE, dd MMM yyyy", Locale.getDefault());

        year_x = year;
        month_x = month;
        day_x = dayOfMonth;

        Calendar newDate = Calendar.getInstance();
        newDate.set(year_x, month_x, day_x);

        // Update minDate to date of return.
        mMinReturnDate = newDate.getTimeInMillis();

        String departureDatetime = dateFormat.format(newDate.getTime());
        mDepartureDate.setText(departureDatetime);

        newDate.add(Calendar.DATE, 1);

        String returnDatetime = dateFormat.format(newDate.getTime());
        mReturnDate.setText(returnDatetime);
    }
};

Проблема в том, что во второй раз, когда я обновляю дату первого календаря, второй minDate всегда получает старую дату в первый раз, когда я ее выбрал.

/**
 * Show calendar from return date.
 *
 * @param context
 * @param year
 * @param month
 * @param day
 * @return
 */
protected DatePickerDialog showCalendarFromReturnDate(Context context, int year, int month, int day) {
    DatePickerDialog dialog = new DatePickerDialog(context, returnDatePickerLstner, year, month, day);
    dialog.getDatePicker().setMinDate(mMinReturnDate);

    return dialog;
}

private DatePickerDialog.OnDateSetListener returnDatePickerLstner = new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        DateFormat dateFormat = new SimpleDateFormat("EE, dd MMM yyyy", Locale.getDefault());

        year_x = year;
        month_x = month;
        day_x = dayOfMonth;

        Calendar newDate = Calendar.getInstance();
        newDate.set(year_x, month_x, day_x);

        String returnDatetime = dateFormat.format(newDate.getTime());
        mReturnDate.setText(returnDatetime);
    }
};

Выберите дату в первом диалоговом окне

Выбрать дату в первом диалоговом окне

Выберите дату во втором диалоговом окне

теперь выберите дату во втором диалоговом окне

Дата обновления в первом диалоговом окне

введите описание изображения здесь

И вот, ошибка в дате второго диалога

дата второго диалога

.

* EDIT: Я подозреваю, что DatePickerDialog не создается каждый раз, когда я нажимаю на вход, поэтому я решил отладить метод второго диалога datepicker showCalendarFromReturnDate (), и это не всегда происходит здесь.

В слушателе этого второго диалогового окна datepicker я добавил в конечном методе onDataSet () способ удалить диалог removeDialog (RETURNDATE_DIALOG_ID);, но даже тогда иногда minDate не задан, потому что перед запуском диалога или прохождением метода.

Я не знаю, что делать.

@Override
protected Dialog onCreateDialog(int id) {
    super.onCreateDialog(id);

    if (id == DEPARTUREDATE_DIALOG_ID)
        return showCalendarFromDepartureDate(mContext, year_x, month_x, day_x);

    else if (id == RETURNDATE_DIALOG_ID)
        return showCalendarFromReturnDate(mContext, year_x, month_x, day_x);

    return null;
}

...


protected DatePickerDialog showCalendarFromReturnDate(Context context, int year, int month, int day) {
    Log.d(TAG, "==== DatePickerDialog from returnDate ====");
    Log.d(TAG, "minDate is: " + mMinReturnDate);
    Log.d(TAG, "year is: " + year);
    Log.d(TAG, "month is: " + month);
    Log.d(TAG, "day is: " + day);

    DatePickerDialog dialog = new DatePickerDialog(context, returnDatePickerLstner, year, month, day);
    dialog.getDatePicker().setMinDate(mMinReturnDate);

    return dialog;
}

private DatePickerDialog.OnDateSetListener returnDatePickerLstner = new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        DateFormat dateFormat = new SimpleDateFormat("EE, dd MMM yyyy", Locale.getDefault());

        year_x = year;
        month_x = month;
        day_x = dayOfMonth;

        Calendar newDate = Calendar.getInstance();
        newDate.set(year_x, month_x, day_x);

        String returnDatetime = dateFormat.format(newDate.getTime());
        mReturnDate.setText(returnDatetime);

        //@TODO: I try to resolve this bug with this but it doesn't always work.
        removeDialog(RETURNDATE_DIALOG_ID);
    }
};

Что происходит с парнями?

Ответ 4

Я не могу дать вам рабочий код, так как я нахожусь в туре и не имею доступа к своему компьютеру. но я могу дать вам способ достичь вашей цели (или, как я думаю).

Я не уверен, что это сработает отлично, но стоит попробовать.

Попробуйте этот код и сообщите мне.

"DatepickerType" представляет собой переменную открытого элемента Integer класса.

private DatePickerDialog.OnDateSetListener datePickerListener = new DatePickerDialog.OnDateSetListener() {

    // when dialog box is closed, below method will be called.
    public void onDateSet(DatePicker view, int selectedYear,
            int selectedMonth, int selectedDay) {
        int y = Calendar.getInstance().get(Calendar.YEAR);
        switch(DatepickerType){
        case 1:
            if(selectedYear>(y-2)){
                //Add message if you want
                selectedYear = y-2;
            }
                else if(selectedYear<(y-12)) {
                //Add msg if u want
                    selectedYear = y-12;
            }

        case 2:
            if(selectedYear>(y)){
                //Add message if you want
                selectedYear = y;
            }
                else if(selectedYear<(y-2)) {
                //Add msg if u want
                    selectedYear = y-2;
            }
        }

        String year1 = String.valueOf(selectedYear);
        String month1 = String.valueOf(selectedMonth+1);
        String day1 = String.valueOf(selectedDay);
        //do what you need
        setLastStatus();

    }
};

Ответ 5

Пусть это поможет вам. Лучше использовать фрагмент диалога, поскольку showDialog() диалогового окна устарел. Также имейте в виду, что он будет работать только в API выше 11. Итак, измените min.sdk в манифесте на 11.

Calendar calendar=Calendar.getInstance();
    int mDay = calendar.get(Calendar.DAY_OF_MONTH), mMonth = calendar.get(Calendar.MONTH), mYear = calendar.get(Calendar.YEAR);


    int minDay = calendar.get(Calendar.DAY_OF_MONTH), minMonth = calendar.get(Calendar.MONTH), minYear = calendar.get(Calendar.YEAR)-12;

int maxDay = calendar.get(Calendar.DAY_OF_MONTH), maxMonth = calendar.get(Calendar.MONTH), maxYear = calendar.get(Calendar.YEAR)-12;


public void onDate(View view) {
        System.out.println("hello");
        DialogFragment fragment = new SelectDateFragment();
        fragment.show(getFragmentManager(), "Date Picker");
    }

    class SelectDateFragment extends DialogFragment implements
            DatePickerDialog.OnDateSetListener {

        public Dialog onCreateDialog(Bundle savedInstanceState) {


            System.out.println("entrering on create dialog");;

            return new DatePickerDialog(getActivity(), this, mYear, mMonth,
                    mDay) {

                public void onDateChanged(DatePicker view, int year,
                        int monthOfYear, int dayOfMonth) {
                    System.out.println("----------onDateChanged()-----------"
                            + year + "--" + year);
                    System.out.println("----------onDateChanged()-----------"
                            + monthOfYear + "--" + monthOfYear);
                    System.out.println("----------onDateChanged()-----------"
                            + dayOfMonth + "--" + dayOfMonth);

                    if ((minYear < year)
                            || ((minMonth < monthOfYear) && (minYear == year))
                            || ((minDay < dayOfMonth) && (minYear == year) && (minMonth == monthOfYear))) {
                        view.updateDate(minYear, minMonth - 1, minDay);

                    }

if ((maxYear > year)
                            || ((maxMonth > monthOfYear) && (maxYear == year))
                            || ((maxDay > dayOfMonth) && (maxYear == year) && (maxMonth == monthOfYear))) {
                        view.updateDate(maxYear, maxMonth - 1, maxDay);

                    }

                }
            };

        }

        @Override
        public void onDateSet(android.widget.DatePicker view, int year,
                int monthOfYear, int dayOfMonth) {
            System.out.println("year=" + year + "day=" + dayOfMonth + "month="
                    + monthOfYear);
            mYear=year;
            mMonth=monthOfYear;
            mDay=dayOfMonth;

            onPopulateSet(year, monthOfYear + 1, dayOfMonth);

        }


        private void onPopulateSet(int year, int i, int dayOfMonth) {
            EditText et_setDate;
            et_setDate = (EditText) findViewById(R.id.register_et_dob);
            et_setDate.setText(dayOfMonth + "/" + i + "/" + year);
            System.out.println("enetring on populate Set");

        }

    }

Ответ 6

    datePickerDialog = new CustomDatePickerDialog(this,
                new OnDateSetListener() {
                    @Override
                    public void onDateSet(DatePicker view, int year,
                            int monthOfYear, int dayOfMonth) {
                        // TODO Auto-generated method stub
                        try {
                            Log.i("DAta SEt", "data set");
                        } catch (Exception e) {

                        }

                    }

                }, minYear, minMonth, minDay, maxYear, maxMonth, maxDay);

CustomDatePickerDialog:

public class CustomDatePickerDialog extends DatePickerDialog {

private boolean mIgnoreEvent = false, mignorsunday = true;

public static int mYear, mMonth, mDate, maxYear, maxMonth, maxDay, minYear,
        minMonth, minDay;
public static int dateflag = 0;
public static int dateflag2 = 0;

public CustomDatePickerDialog(Context context, OnDateSetListener callBack,
        int year, int monthOfYear, int dayOfMonth, int maxYear,
        int maxMonth, int maxDay) {
    super(context, callBack, year, monthOfYear, dayOfMonth);
    // TODO Auto-generated constructor stub
    dateflag = 0;
    dateflag2 = 1;
    mYear = year;
    mMonth = monthOfYear;
    mDate = dayOfMonth;

    Log.i("Hello World ::", "Please Its Updating At Every time");

    this.maxYear = maxYear;
    this.maxMonth = maxMonth;
    this.maxDay = maxDay;
    this.minYear = year;
    this.minMonth = monthOfYear;
    this.minDay = dayOfMonth;

    // setTitle("בחרו מתי נח לכם שנתקשר");
    setTitle("We Call U...בחרו מתי נוח לכם ש");

}

@Override
public void onDateChanged(DatePicker view, int year, int month, int day) {
    // TODO Auto-generated method stub
    super.onDateChanged(view, year, month, day);
    dateflag = 1;
    dateflag2 = 1;
    if (!mIgnoreEvent) {
        mIgnoreEvent = true;
        if (year > maxYear || month > maxMonth && year == maxYear
                || day > maxDay && year == maxYear && month == maxMonth) {
            mYear = maxYear;
            mMonth = maxMonth;
            mDate = maxDay;
            view.updateDate(maxYear, maxMonth, maxDay);
        } else if (year < minYear || month < minMonth && year == minYear
                || day < minDay && year == minYear && month == minMonth) {
            mYear = minYear;
            mMonth = minMonth;
            mDate = minDay;
            view.updateDate(minYear, minMonth, minDay);
        } else {
            Calendar cal = Calendar.getInstance();
            cal.set(Calendar.YEAR, year);
            cal.set(Calendar.MONTH, month);
            cal.set(Calendar.DATE, day);
            if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {

                if (mignorsunday) {
                    cal.add(Calendar.DATE, 1);
                    mYear = cal.get(Calendar.YEAR);
                    mMonth = cal.get(Calendar.MONTH);
                    mDate = cal.get(Calendar.DATE);
                    mignorsunday = false;
                } else if (!mignorsunday) {
                    mignorsunday = true;
                    cal.add(Calendar.DATE, -1);
                    mYear = cal.get(Calendar.YEAR);
                    mMonth = cal.get(Calendar.MONTH);
                    mDate = cal.get(Calendar.DATE);
                }
            } else {
                mYear = year;
                mMonth = month;
                mDate = day;
            }
            view.updateDate(mYear, mMonth, mDate);
        }
        setTitle("We Call U...בחרו מתי נוח לכם ש");
        mIgnoreEvent = false;
    }
}

public int getSelectedYear() {
    return mYear;
}

public int getSelectedMonth() {
    return mMonth;
}

public int getSelectedDate() {
    return mDate;
}
}

Ответ 7

Вот рабочий код, вы должны внести некоторые изменения в соответствии с вашим кодом. Как вы можете добавить минимальный и максимальный возраст для ребенка и младенца.

private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {

    public void onDateSet(DatePicker view, int year, int monthOfYear,
                          int dayOfMonth) {
    /*
     * mYear = year;
     * mMonth = monthOfYear;
     * mDay = dayOfMonth;
     */
        if (year > maxYear || monthOfYear > maxMonth && year == maxYear ||
                dayOfMonth > maxDay && year == maxYear && monthOfYear == maxMonth) {
            view.updateDate(maxYear, maxMonth, maxDay);
            //you can add toast message here for max year selection
        } else if (year < minYear || monthOfYear < minMonth && year == minYear ||
                dayOfMonth < minDay && year == minYear && monthOfYear == minMonth) {
            view.updateDate(minYear, minMonth, minDay);
            //you can add toast message here for min year selection
        } else {
            view.updateDate(year, monthOfYear, dayOfMonth);
        }
    }

};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mPickDate = (Button) findViewById(R.id.pickDate);
    mPickDate.setOnClickListener(this);

    final Calendar c = Calendar.getInstance();
    mYear = c.get(Calendar.YEAR);
    mMonth = c.get(Calendar.MONTH);
    mDay = c.get(Calendar.DAY_OF_MONTH);

    maxYear = mYear - 2;//make a proper condition to change it the based on the   child/infant
    maxMonth = mMonth;
    maxDay = mDay;

    minYear = mYear - 12;//make a proper condition to change it the based on the child/infant
    minMonth = mMonth;
    minDay = mDay;

}

@Override
public void onClick(View v) {
    showDialog(DATE_DIALOG_ID);
}

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
        case DATE_DIALOG_ID:
            return new DatePickerDialog(this, mDateSetListener, mYear - minYear,
                    mMonth, mDay);
    }
    return null;
}

Ответ 8

Если вы не хотите использовать Custom Dialog, используйте этот код

datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis());