web-dev-qa-db-fra.com

Définir une limite sur le DatePickerDialog dans Android?

Comment limiter DatePickerDialog pour choisir une date de 2 à 12 ans dans le passé ou de 0 à 2 ans à partir de la date actuelle?

J'ai DatePickerDialog en activité qui est utilisé pour obtenir la date de naissance de l'enfant et du nourrisson. L'âge de l'enfant sera (2-12 ans) et l'âge du nourrisson (0-2 ans). Si je passe 1, alors la limite d'âge devrait être (2-12 ans) et si je passe 2, la limite d'âge devrait être (0-2 ans).

Que puis-je faire pour obtenir cette fonctionnalité dans mon calendrier?

Mon code de calendrier est:

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

Toutes les autres réponses semblent plutôt compliquées, donc je vais juste dire l'évidence: vous pouvez obtenir le DatePicker sous-jacent à partir d'un DatePickerDialog (en appelant simplement getDatePicker() ) et définissez ses limites en utilisant:

Où l'argument est le nombre habituel de millisecondes depuis le 1er janvier 1970 00:00:00 dans le fuseau horaire par défaut. Bien sûr, vous devrez toujours calculer ces valeurs, mais cela devrait être trivial pour la classe Calendar: il suffit de prendre la date actuelle et d'ajouter ou de soustraire x années.

Le lecteur le plus attentif remarquera que les setters susmentionnés n'étaient pas disponibles jusqu'au niveau 11 de l'API. Si vous ciblez cette plate-forme (ou plus récente) uniquement, alors vous êtes prêt à partir. Si vous souhaitez également prendre en charge les appareils Gingerbread (Android 2.3/API niveau 9+), vous pouvez utiliser un version rétroportée de DatePicker à la place.

167
MH.

La définition du minimum et de la date maximale pour le DatePickerDialog n'est pas suffisante. L'utilisateur peut cliquer sur l'année et faire défiler les années.

Vous devez également définir la plage d'années sur le DatePicker comme ceci:

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

Je ne suis pas en mesure de vous donner le code de travail, car je suis en tournée et je n'ai pas eu accès à mon PC. mais je peux vous donner un moyen d'atteindre votre objectif (ou du moins je pense).

Je ne suis pas sûr que cela fonctionnera parfaitement, mais cela vaut la peine d'essayer.

Veuillez essayer ce code et informez-moi.

"DatepickerType" est une variable membre publique Integer de la classe.

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

    }
};
1
Arun Shankar

Que cela vous aide. Mieux vaut utiliser le fragment de dialogue car showDialog() de Dialog est obsolète. Gardez également à l'esprit que cela ne fonctionnera que dans les API supérieures à 11. Donc, changez min.sdk dans le manifeste à 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");

        }

    }
1
Harsh Parikh
    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;
}
}
0
Teraiya Mayur

Voici le code de travail, vous devez faire quelques changements en fonction de votre code. Comme vous pouvez ajouter l'âge minimum et maximum pour l'enfant et le bébé.

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;
}
0
Shakeeb Ayaz