web-dev-qa-db-fra.com

Android DatePickerDialog: définir la date min et max pour la sélection

Je sais qu'il y a beaucoup de questions pour cela, mais aucune des solutions ne fonctionne pour moi, donc cette question. Je veux restreindre l'utilisateur à sélectionner une date avant aujourd'hui, mais je ne suis pas en mesure de le faire.

public class DatePickerDialogFragment extends DialogFragment {

    private OnDateSetListener listener;

    public void setListener(OnDateSetListener listener) {
        this.listener = listener;
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Calendar calendar = Calendar.getInstance();
        int year    = calendar.get(Calendar.YEAR);
        int month   = calendar.get(Calendar.MONTH);
        int day     = calendar.get(Calendar.DAY_OF_MONTH);

        DatePickerDialog dialog = new DatePickerDialog(getContext(), listener, year, month, day);
        dialog.getDatePicker().setMinDate(calendar.getTimeInMillis());
        return dialog;
    }
}

Je le montre comme:

DatePickerDialogFragment fragment = new DatePickerDialogFragment();
fragment.setListener(dateSetListener);
fragment.show(getSupportFragmentManager(), "Choose booking date");

Je souhaite que l'utilisateur ne puisse pas sélectionner la date avant aujourd'hui. Comme vous pouvez le voir, j'ai appelé la méthode setMinDate() avec l'heure d'aujourd'hui mais sans effet. La boîte de dialogue affiche les dates avant aujourd'hui grisées mais sélectionnables.

J'ai également essayé de sous-classer DatePickerDialog et de remplacer onDateChanged comme suggéré dans certaines réponses de stackoverflow mais sans succès.

15
Abdullah

Essayez cette méthode

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Calendar calendar = Calendar.getInstance();
    int year    = calendar.get(Calendar.YEAR);
    int month   = calendar.get(Calendar.MONTH);
    int day     = calendar.get(Calendar.DAY_OF_MONTH);

    DatePickerDialog dialog = new DatePickerDialog(getContext(), listener, year, month, day);
    Field mDatePickerField;
    try {
            mDatePickerField = dialog.getClass().getDeclaredField("mDatePicker");
            mDatePickerField.setAccessible(true);
    } catch (Exception e) {
            e.printStackTrace();
    }
    dialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
    return dialog;
}

au lieu de votre

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Calendar calendar = Calendar.getInstance();
    int year    = calendar.get(Calendar.YEAR);
    int month   = calendar.get(Calendar.MONTH);
    int day     = calendar.get(Calendar.DAY_OF_MONTH);

    DatePickerDialog dialog = new DatePickerDialog(getContext(), listener, year, month, day);
    dialog.getDatePicker().setMinDate(calendar.getTimeInMillis());
    return dialog;
}

EDIT1:

J'ai également rencontré ce problème: l'utilisateur peut sélectionner des dates non sélectionnables dans Android L 5.0.2. Actuellement, un bug a été signalé ici . Il est résolu dans Android L 5.1.0.

Pour une solution temporaire de ce problème, vous pouvez comparer la date sélectionnée avec la date actuelle du système et mettre une condition basée sur cela. J'ai utilisé cela comme solution de contournement

EDIT2:

ajoutez la méthode onDateSent() dans DatePickerDialogFragment et vérifiez simplement si elle est antérieure à la date que vous avez définie dans setMinDate(). Si c'est le cas, affichez à nouveau le DatePickerDialog.

final long today = System.currentTimeMillis() - 1000;

@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            Calendar calendar = Calendar.getInstance();
            calendar.set(year, monthOfYear, dayOfMonth);
            //If user tries to select date in past (or today)
            if (calendar.getTimeInMillis() < today)
            {
                //Make them try again
               DatePickerDialogFragment fragment = new DatePickerDialogFragment();
               fragment.setListener(dateSetListener);
               fragment.show(getSupportFragmentManager(), "Choose booking date");
               Toast.makeText(this, "Invalid date, please try again", Toast.LENGTH_LONG).show();
            }
            else
            {
                //success
            }
}
18
Rajesh

Obtenez l'heure système et soustrayez-en 1 seconde

 @Override
 public Dialog onCreateDialog(Bundle savedInstanceState) {
    Calendar calendar = Calendar.getInstance();
    int year    = calendar.get(Calendar.YEAR);
    int month   = calendar.get(Calendar.MONTH);
    int day     = calendar.get(Calendar.DAY_OF_MONTH);

     dialog = new DatePickerDialog(act, listener, year, month, day);
     dialog.getDatePicker().setMinDate(System.currentTimeMillis() -1000);
     return dialog;
 }
6
Kishore Jethava
dialog.getDatePicker().setMinDate(calendar.getTimeInMillis());
3
Arpit

Au-dessus de l'API 11 Pour une date minimale, vous pouvez utiliser

Android:minDate="mm/dd/yyyy" Ou setMinDate(long time) Pour date max

Android:maxDate="mm/dd/yyyy" // En XML

setMaxDate(new Date().getTime()); // Heure actuelle

1
Sangeeta