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.
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
}
}
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;
}
dialog.getDatePicker().setMinDate(calendar.getTimeInMillis());
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