2015-10-10 84 views
6

我知道这个问题有很多问题,但没有一个解决方案适用于我,所以这个问题。我想限制用户在今天之前选择日期,但我无法这样做。Android DatePickerDialog:设置最小和最大日期选择

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

我显示它:

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

我希望用户不应该能够在今天之前选择的日期。正如你所看到的,我用今天的时间调用setMinDate()方法,但它没有效果。该对话框显示今天之前的日期变灰,但可以选择。

我也尝试子类DatePickerDialog并覆盖onDateChanged建议在一些stackoverflow答案,但没有任何成功。

+0

不聪明完成,但onDateSet,应该比较的最小和最大价值导致 – cuasodayleo

+0

@Abdullah你找到任何工作了这个..? –

+0

@RethinavelPillai我最终做了接受的帖子中提到的内容。 – Abdullah

回答

7

尝试此方法

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

,而不是你

@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:

我也面临这个问题,用户可以在Android L 5.0.2选择不选择的日期。目前有臭虫报告here。这是在Android L 5.1.0解决。

对于此问题的临时解决方案,您可以将选定的日期与当前的系统日期进行比较,并根据此日期设置一些条件。我用这个作为我的解决办法

EDIT2:

DatePickerDialogFragment添加onDateSent()方法,只是检查,如果它比你在setMinDate()设定的日期。如果是这样,那么只需再次显示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 
      } 
} 
+0

它不工作。:( – Abdullah

+0

@Abdullah你正在使用的android棒棒糖版本? – Rajesh

+0

这是Android 5.0。2 – Abdullah

1

以上API为11分钟时间,你可以使用

android:minDate="mm/dd/yyyy"setMinDate(long time) 马克斯日期

android:maxDate="mm/dd/yyyy" //在XML

setMaxDate(new Date().getTime()); //当前时间

+1

我打电话给setMinDate(),但没有任何效果。 – Abdullah

4

获取系统时间并从中减去1秒

@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; 
} 
+1

不起作用。 :( – Abdullah

相关问题