2015-01-21 83 views
2

我有2個DatePicker,第一個是開始日期,第二個是結束日期。我想兩者都有maxDate當前日期(並且這與我的代碼一起工作),我希望當我更改開始日期時,第二個DatePicker的minDate將更新爲此日期(反之亦然)。有了這個listner我處理動作,但第二個DatePicker不會刷新佈局上的minDate。Android - 更新DatePicker的minDate和maxDate多次

private DatePicker.OnDateChangedListener startDataListener = new DatePicker.OnDateChangedListener() { 

    public void onDateChanged(DatePicker view, int year, int monthOfYear, 
      int dayOfMonth) { 
     Calendar c = Calendar.getInstance(); 
     c.set(year, monthOfYear, dayOfMonth); 
     endDate.setMinDate(c.getTimeInMillis()); 
    } 
}; 

private DatePicker.OnDateChangedListener endDateListener = new DatePicker.OnDateChangedListener() { 

    public void onDateChanged(DatePicker view, int year, int monthOfYear, 
      int dayOfMonth) { 

     Calendar c = Calendar.getInstance(); 
     c.set(year, monthOfYear, dayOfMonth); 
     startDate.setMaxDate(c.getTimeInMillis()); 
    } 
}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    startDate= (DatePicker)findViewById(***); 
    endDate= (DatePicker)findViewById(***); 

    startDate.setMaxDate(Calendar.getInstance().getTimeInMillis()); 
    startDate.init(year, month, day, startDateListener); 

    endDate.setMinDate(c.getTimeInMillis()-1000); 
    endDate.setMaxDate(c.getTimeInMillis()); 
    endDate.init(year, month, day, endDateListener); 
} 

回答

2

https://stackoverflow.com/a/19722636

出現這種情況的,因爲這setMinDate()代碼有檢查:

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

簡單的解決方法是先設定分鐘日期不同的年份。

利用所提出的解決方案,避免聽者執行當溶液被施加我來到這個:

DatePicker startDate, endDate; 
Calendar minDate = Calendar.getInstance(), maxDate = Calendar.getInstance(); 
boolean callFromStartDate = false, callFromEndDate = false; 

private DatePicker.OnDateChangedListener startDateListener = new DatePicker.OnDateChangedListener() { 
    public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
     // Avoid listener execution when there's a forced updated on picker 
     if(callFromEndDate){ 
      callFromEndDate = false; 
      return; 
     } 

     callFromStartDate = true; 

     // Force picker update 
     minDate.set(year - 1, monthOfYear, dayOfMonth); 
     endDate.setMinDate(minDate.getTimeInMillis()); // Calls onDateChange from the other picker 

     callFromStartDate = true; 

     // Update the picker to the desired date 
     minDate.set(year, monthOfYear, dayOfMonth); 
     endDate.setMinDate(minDate.getTimeInMillis()); 
    } 
}; 

private DatePicker.OnDateChangedListener endDateListener = new DatePicker.OnDateChangedListener() { 
    public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
     if(callFromStartDate) { 
      callFromStartDate = false; 
      return; 
     } 

     callFromEndDate = true; 

     maxDate.set(year + 1, monthOfYear, dayOfMonth); 
     startDate.setMaxDate(maxDate.getTimeInMillis()); 

     callFromEndDate = true; 

     maxDate.set(year, monthOfYear, dayOfMonth); 
     startDate.setMaxDate(maxDate.getTimeInMillis()); 
    } 
}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 

    startDate = (DatePicker) findViewById(R.id.datePicker); 
    endDate = (DatePicker) findViewById(R.id.datePicker2); 

    Calendar c = Calendar.getInstance(); 
    int year = c.get(Calendar.YEAR); 
    int month = c.get(Calendar.MONTH); 
    int day = c.get(Calendar.DAY_OF_MONTH); 
    long initialTimeInMillis = c.getTimeInMillis(); 

    startDate.setMinDate(initialTimeInMillis-2000000000); 
    startDate.setMaxDate(initialTimeInMillis); 
    startDate.init(year, month, day, startDateListener); 

    endDate.setMinDate(initialTimeInMillis-2000000000); 
    endDate.setMaxDate(initialTimeInMillis); 
    endDate.init(year, month, day, endDateListener); 
} 
+0

沒有這個不工作..我有同樣的問題檢查http://stackoverflow.com/questions/28297919/android-update-mindate-and-maxdate-of-a-datepickers-many-times - 用於啓動最新 – SAndroidD 2015-02-03 13:25:27

1

這是因爲方法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); 
//The Min date you wish to set. 
mPicker.setMinDate(new LocalDate().minusWeeks(2) 
          .toDateTimeAtStartOfDay().getMillis()); 

由此一年有b因爲新的Min Date被更改,因此它會設置新的日期。 這適用於我

相關問題