2013-10-27 4 views
12

Я в конкретной ситуации, когда мне нужно изменить минимальную и максимальную дату DatePicker в соответствии с выбранным элементом Spinner. Вот кусок кода, который я использую для переключения минимальной и максимальной даты.setMinDate (...) для DatePicker не работает при вызове во второй раз

private void switchCalculationMethod(int method) { 
    calculationMethod = method; 
    switch (method) { 
     case METHOD_1: 
      datePicker.setMinDate(new LocalDate().minusWeeks(42).getMillis()); 
      datePicker.setMaxDate(new LocalDate().plusDays(1).getMillis() - 1); 
      break; 
     case METHOD_2: 
      datePicker.setMinDate(new LocalDate().minusWeeks(2).getMillis()); // This don't work!! 
      datePicker.setMaxDate(new LocalDate().plusWeeks(40).getMillis()); // This works!!! 
      break; 
    } 
    datePicker.init(today.getYear(), today.getMonthOfYear() - 1, 
      today.getDayOfMonth(), this); 
} 

Итак, DatePicker бы получить настроить правильно в первый раз, проблема возникает при попытке изменить дату мин снова (изменение макс даты работы). Он остался бы на том значении, которое я поставил первым. Я думаю, что это ошибка. Я здесь что-то не так? Есть ли обходной путь для этого ?.

PS: Я использую время авизо Joda.

+0

Любые конкретные причины, по которым вы не использовали toDateTimeAtStartOfDay() на вашем втором setMinDate? – Voidpaw

+0

@ Voidpaw Нет, это была ошибка при редактировании вопроса. Теперь я использую собственный метод. Просто подумал, что я пропустил эту часть для простоты. Исправленный. –

ответ

28

Это происходит потому, что метод setMinDate() имеет проверить

if (mTempDate.get(Calendar.YEAR) == mMinDate.get(Calendar.YEAR) 
       && mTempDate.get(Calendar.DAY_OF_YEAR) != mMinDate.get(Calendar.DAY_OF_YEAR){ 
      return; 
} 

Простой обходной путь, чтобы установить дату мин с другой год в первом, например

mPicker.setMinDate(0); 

mPicker.setMinDate(new LocalDate().minusWeeks(2) 
           .toDateTimeAtStartOfDay().getMillis()); 

Это работает для меня.

+2

Я не знаю, почему, черт возьми, это проверка, но это сделало трюк для меня. Должно быть, стажер. –

+1

Спасибо @Vang – Furqan

+0

Я назначал 'DatePickerDialog' где-то в другом месте, чтобы изменить minDate, мне пришлось повторно назначить' DatePickerDialog'. например 'mPicker = new DatePickerDialog (.., ..., ...., ..)', а затем сбросить minDate и setMinDate. @Nicolas ответ был полезным в reset.3. – Prabs

0

первое обновление setMinDate до 0 после того, как то setMinDate согласно вам dateobject

mPicker.setMinDate (0);

mPicker.setMinDate (datepickerObject.getTimeInMillis());

0

Это нехорошее решение этой проблемы, но оно работает для меня. Я просто создаю новый DatePicker каждый раз, когда нажимают TextView и устанавливают необходимые даты (min, max). Возможно, это не дружелюбная к памяти, но я не нашел другого решения.

public class CustomDatePicker extends TextView { 

private long mMinDate; 
private long mMaxDate; 

public CustomDatePicker(Context context) { 
    this(context, null, 0); 
} 

public CustomDatePicker(Context context, AttributeSet attrs) { 
    this(context, attrs, 0); 
} 

public CustomDatePicker(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, 0); 

    final Calendar calendar = Calendar.getInstance(); 
    final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US); 

    final DatePickerDialog.OnDateSetListener onDateSetListener = new DatePickerDialog.OnDateSetListener() { 
     @Override 
     public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { 
      calendar.set(Calendar.YEAR, year); 
      calendar.set(Calendar.MONTH, month); 
      calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); 
      setText(dateFormat.format(calendar.getTime())); 
     } 
    }; 

    mMinDate = -1; 
    mMaxDate = -1; 

    setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      DatePickerDialog datePickerDialog = new DatePickerDialog(
        getContext(), 
        R.style.DatePickerStyle, 
        onDateSetListener, 
        calendar.get(Calendar.YEAR), 
        calendar.get(Calendar.MONTH), 
        calendar.get(Calendar.DAY_OF_MONTH) 
      ); 

      if (mMinDate != -1) datePickerDialog.getDatePicker().setMinDate(mMinDate); 
      if (mMaxDate != -1) datePickerDialog.getDatePicker().setMaxDate(mMaxDate); 
      datePickerDialog.show(); 
     } 
    }); 
} 

public void setMinDate(long minDate) { 
    mMinDate = minDate; 
} 

public void setMaxDate(long maxDate) { 
    mMaxDate = maxDate; 
} 

} 
2

Как было сказано выше, вы можете обойти проверку, вызвав тем до фактического изменения значения:

setMinDate(0); 
setMaxDate(Long.MAX_VALUE); 

Если вы хотите сбросить минимальное или максимальное значение его по умолчанию, вы можете используйте следующие значения:

setMinDate(-2208902400000L); // Jan 1, 1900 
setMaxDate(4102531200000L); // Jan 1, 2100 
Смежные вопросы