2013-10-27 20 views
12

Tôi đang ở trong một tình huống cụ thể, trong đó tôi phải thay đổi ngày tối thiểu và tối thiểu là DatePicker theo phần tử được chọn là Spinner. Đây là đoạn mã tôi đang sử dụng để chuyển đổi tối thiểu và ngày tối đa.setMinDate (...) cho DatePicker không hoạt động khi được gọi lần thứ hai

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

Vì vậy, DatePicker sẽ được thiết lập một cách chính xác lần đầu tiên, vấn đề xảy ra khi tôi cố gắng để thay đổi ngày tối thiểu một lần nữa (thay đổi công trình ngày tối đa). Nó sẽ vẫn ở giá trị tôi đã đặt trước. Tôi nghĩ đây là một lỗi. Tôi có làm gì sai ở đây không? Có một cách giải quyết cho điều này?.

PS: Tôi đang sử dụng api thời gian Joda.

+0

Bất kỳ lý do cụ thể nào mà bạn không sử dụng đểDateTimeAtStartOfDay() trên setMinDate thứ hai của bạn? – Voidpaw

+0

@Voidpaw Không, đó là một sai lầm trong khi chỉnh sửa câu hỏi. Tôi đang sử dụng một phương pháp tùy chỉnh cho điều đó ngay bây giờ. Chỉ nghĩ rằng tôi sẽ bỏ qua phần đó để đơn giản. Đã sửa. –

Trả lời

28

Điều này xảy ra bởi vì phương pháp setMinDate() có kiểm tra

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

Simple workaround là để thiết lập ngày phút với năm khác nhau lúc đầu, ví dụ

mPicker.setMinDate(0); 

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

Nó làm việc cho tôi.

+2

Tôi không chắc chắn tại sao địa ngục kiểm tra là có, nhưng điều này đã làm các trick cho tôi. Phải là một thực tập sinh. –

+1

Cảm ơn bạn @Vang – Furqan

+0

Tôi đã chỉ định 'DatePickerDialog' ở một nơi khác, để thay đổi minDate tôi phải gán lại' DatePickerDialog'. như 'mPicker = new DatePickerDialog (.., ..., ...., ..)' rồi đặt lại minDate và setMinDate. @Nicolas trả lời là hữu ích trong reset.3. – Prabs

0

đầu tiên cập nhật setMinDate đến 0 sau đó setMinDate theo bạn dateobject

mPicker.setMinDate (0);

mPicker.setMinDate (datepickerObject.getTimeInMillis());

0

Đây không phải là giải pháp tốt cho vấn đề này, nhưng nó phù hợp với tôi. Tôi chỉ đơn giản là tạo ra một DatePicker mới mỗi khi TextView được nhấp và thiết lập các ngày cần thiết (min, max). Nó có thể không phải là bộ nhớ thân thiện, nhưng tôi đã không tìm thấy bất kỳ giải pháp khác.

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

Như đã nói ở trên, bạn có thể bỏ qua việc kiểm tra bằng cách gọi những người trước khi thực sự thay đổi giá trị:

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

Nếu bạn muốn reset mức tối thiểu hoặc giá trị tối đa mặc định của nó, bạn có thể sử dụng các giá trị sau:

setMinDate(-2208902400000L); // Jan 1, 1900 
setMaxDate(4102531200000L); // Jan 1, 2100 
Các vấn đề liên quan