Establecer límite en DatePickerDialog en Android?

¿Cómo limitar el DatePickerDialog para elegir una fecha de 2 a 12 años en el pasado o de 0 a 2 años a partir de la fecha actual?

Tengo DatePickerDialog en la actividad que se utiliza para obtener la fecha de nacimiento para niños y bebés. La edad del niño será (2-12 años) y la edad del bebé puede ser (0-2 años). Si supero 1, entonces el límite de edad debería ser (2-12 años) y si supero 2, el límite de edad debería ser (0-2 años).

¿Qué podría hacer para obtener esta funcionalidad en mi calendario?

Mi código de calendario es:

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

Todas las otras respuestas parecen complicadas, así que solo voy a decir lo obvio: puede obtener el DatePicker subyacente de un DatePickerDialog (simplemente llamando a getDatePicker() ) y establecer sus límites usando:

  • setMinDate(long minDate)
  • setMaxDate(long maxDate)

Donde el argumento es la cantidad habitual de milisegundos desde el 1 de enero de 1970 00:00:00 en la zona horaria predeterminada. De todos modos, tendrá que calcular estos valores, pero eso debería ser trivial con la clase Calendar : simplemente tome la fecha actual y agregue o resta x años.

El lector más atento se dará cuenta de que los incubadores antes mencionados no estaban disponibles hasta el nivel 11 de la API. Si se dirige solo a esa (o más nueva) plataforma, entonces está listo. Si también quieres soportar, es decir, dispositivos Gingerbread (Android 2.3 / API nivel 9+), puedes usar una versión backported de DatePicker en lugar de DatePicker .

Establecer el mínimo y la fecha máxima para DatePickerDialog no es suficiente. El usuario puede hacer clic en el año y desplazarse entre los años.

También debe establecer el rango de año en el DatePicker de esta manera:

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

No estoy en posición de darte el código de trabajo, ya que estoy de gira y no tuve acceso a mi PC. pero puedo darte una manera de lograr tu objective (o eso creo).

No estoy seguro de que esto funcione a la perfección, pero vale la pena intentarlo.

Por favor, prueba este código e infórmame.

“DatepickerType” es una variable de Miembro pública Integer de la clase.

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

Que esto te ayude Es mejor utilizar el fragmento de diálogo ya que showDialog() de Dialog está en desuso. También tenga en cuenta que solo funcionará en API superior a 11. Por lo tanto, cambie min.sdk en el manifiesto a 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"); } } 
  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; } } 

Aquí está el código de trabajo, tienes que hacer algunos cambios de acuerdo con tu código. Al igual que puede agregar la edad mínima y máxima para niños y bebés.

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

Si no desea usar Diálogo personalizado, utilice este código de línea única

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