2011-03-02 4 views
3

Je dois définir une année max sur le DatePickerDialog que j'utilise mais je suis incapable de trouver un mécanisme pour le faire. La documentation mentionne getDatePicker() en tant que méthode publique de DatePickerDialog. Donc, je pensais, peut-être, que cela peut être utilisé pour obtenir le DatePicker et ensuite je pourrais définir la date max mais j'obtiens l'erreur "Method undefined" quand j'essaye d'obtenir le DatePicker.Date maximum sur un Android DatePickerDialog

Voici comment j'essaie d'obtenir le DatePicker dans mon onCreateDialog.

DatePickerDialog d = new DatePickerDialog(this, dep_dateListener, mYear, 
         mMonth, mDay); 
DatePicker dp = d.getDatePicker(); 
dp.setMaxDate(maxDate); 
return d; 

Des pointeurs sur la façon de procéder?

Merci

Répondre

12

La méthode getDatePicker() est disponible dans l'API de niveau 11.

+1

C'était le problème. Merci. – Nishith

+3

... tout comme 'DatePicker # setMaxDate (...)' – Arjan

+0

pour définir maxDate dans api <11 essayez ceci http://stackoverflow.com/a/32943731/3758898 –

1

pour faire une sous-classe de DatePickerDialog

override onDateChanged méthode

voir le source code

import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 
import android.app.DatePickerDialog; 
import android.content.Context; 
import android.widget.DatePicker; 

public class MyDatePickerDialog extends DatePickerDialog{ 
private final int minYear; 
private final int minMonth; 
private final int minDay; 

private int maxYear; 
private int maxMonth; 
private int maxDay; 

private final Calendar mCalendar; 
private final SimpleDateFormat formatter; 


public MyDatePickerDialog(Context context,OnDateSetListener callBack,int year,int monthOfYear,int dayOfMonth){ 
    super(context,callBack,year,monthOfYear,dayOfMonth); 

    mCalendar = Calendar.getInstance(); 

    //set up mindate 
    minYear=Constant.minYear; 
    minMonth=Constant.minMonth; 
    minDay=Constant.minDay; 

    mCalendar.setTime(new Date()); 
    //set up maxdate 
    mCalendar.add(Calendar.YEAR, Constant.maxBirthdayYearSinceNow); 
    maxYear=mCalendar.get(Calendar.YEAR); 
    maxMonth=mCalendar.get(Calendar.MONTH); 
    maxDay=mCalendar.get(Calendar.DATE); 

    //set up init date 
    mCalendar.set(Calendar.YEAR, year); 
    mCalendar.set(Calendar.MONTH, monthOfYear); 
    mCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); 

    //set up date display format 
    formatter = new SimpleDateFormat("MM/dd/yyyy"); 
    setTitle(formatter.format(mCalendar.getTime())); 
} 

@Override 
public void onDateChanged(DatePicker view, int year,int month, int day){ 
    boolean beforeMinDate=false; 
    boolean afterMaxDate=false; 

    if(year<minYear){ 
     beforeMinDate=true; 
    } 
    else if(year==minYear){ 
     if(month<minMonth){ 
      beforeMinDate=true; 
     } 
     else if(month==minMonth){ 
      if(day<minDay){ 
       beforeMinDate=true; 
      } 
     } 
    } 

    if(!beforeMinDate){ 
     if(year>maxYear){ 
      afterMaxDate=true; 
     } 
     else if(year==maxYear){ 
      if(month>maxMonth){ 
       afterMaxDate=true; 
      } 
      else if(month==maxMonth){ 
       if(day>maxDay){ 
        afterMaxDate=true; 
       } 
      } 
     } 
    } 

    //need set invalid date to mindate or maxdate 
    if(beforeMinDate || afterMaxDate){ 
     if(beforeMinDate){ 
      year=minYear; 
      month=minMonth; 
      day=minDay; 
     } 
     else{ 
      year=maxYear; 
      month=maxMonth; 
      day=maxDay; 
     } 
     view.updateDate(year, month, day); 
    } 

    //display in view title 
    mCalendar.set(Calendar.YEAR, year); 
    mCalendar.set(Calendar.MONTH, month); 
    mCalendar.set(Calendar.DAY_OF_MONTH, day); 
    setTitle(formatter.format(mCalendar.getTime())); 
} 
} 
1

setMaxDate() n'est utile que pour les nouvelles API, mais si vous voulez que votre application fonctionne avec des versions antérieures, vous devez créer votre propre comparateur pour les dates.

Par exemple je reçois juste la date locale en utilisant Calendar.getInstance() et en utilisant la méthode Date.before(Date) OU Date.after(Date) vous pouvez ajouter des restrictions pour DatePicker.

0

Une meilleure mise en œuvre MonoDroid:

public DateTime MaxDate { get; set; } 
public DateTime MinDate { get; set; } 

public override void OnDateChanged(DatePicker view, int year, int month, int day) 
    { 
     var error = false; 

     if (year < MinDate.Year) 
     { 
      error = true; 
      year++; 
     } 
     else if (year == MinDate.Year) 
     { 
      if (month < MinDate.Month - 1) 
      { 
       error = true; 
       month++; 
      } 
      else if (month == MinDate.Month - 1) 
      { 
       if (day < MinDate.Day) 
       { 
        error = true; 
        day++; 
       } 
      } 
     } 

     if (!error) 
     { 
      if (year > MaxDate.Year) 
      { 
       error = true; 
       year--; 
      } 
      else if (year == MaxDate.Year) 
      { 
       if (month > MaxDate.Month - 1) 
       { 
        error = true; 
        month--; 
       } 
       else if (month == MaxDate.Month - 1) 
       { 
        if (day > MaxDate.Day) 
        { 
         error = true; 
         day--; 
        } 
       } 
      } 
     } 

     if (error) 
     { 
      view.UpdateDate(year, month, day); 
     } 

    } 
Questions connexes