2013-10-27 86 views
12

我處於特定情況,必須根據所選元素Spinner更改最小和最大日期DatePicker。以下是我用來切換最小和最大日期的代碼塊。DatePicker的setMinDate(...)在第二次調用時不起作用

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:我正在使用喬達時間API。

+0

任何具體的原因你沒有在你的第二個setMinDate使用toDateTimeAtStartOfDay()? – 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答案在reset3中很有幫助。 – Prabs

0

第一更新setMinDate 0,那麼後setMinDate根據你dateobject

mPicker.setMinDate(0);

mPicker.setMinDate(datepickerObject.getTimeInMillis());

0

這不是一個很好的解決方案,但它適用於我。每次單擊TextView並設置必要的日期(最小值,最大值)時,我只是創建一個新的DatePicker。它可能不是內存友好的,但我還沒有找到任何其他解決方案。

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 
相關問題