2013-10-27 14 views
12

Sono in una situazione particolare in cui devo modificare la data minima e massima di DatePicker in base all'elemento selezionato di Spinner. Ecco il pezzo di codice che sto usando per cambiare la data minima e massima.setMinDate (...) per DatePicker non funziona se richiamato una seconda volta

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

Così, il DatePicker otterrebbe impostato correttamente la prima volta, problema si verifica quando si tenta di cambiare di nuovo la data min (cambiando la data di opere max). Rimarrebbe al valore che avevo impostato per primo. Sto pensando che questo sia un bug. Sto facendo qualcosa di sbagliato qui? C'è una soluzione per questo ?.

PS: sto utilizzando l'API tempo Joda.

+0

Qualsiasi motivo specifico non utilizzato da DateTimeAtStartOfDay() sul secondo setMinDate? – Voidpaw

+0

@Voidpaw Nessuno, è stato un errore durante la modifica della domanda. Sto usando un metodo personalizzato per questo ora. Ho pensato di saltare quella parte per semplicità. Corretto. –

risposta

28

Questo accade perché il metodo setMinDate() ha controllare

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

soluzione semplice è quella di impostare la data min con l'anno diverso in un primo momento, ad esempio

mPicker.setMinDate(0); 

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

Funziona per me.

+2

Non sono sicuro del perché diavolo quell'assegno c'è, ma questo ha fatto il trucco per me. Dev'essere stato uno stagista. –

+1

Grazie @Vang – Furqan

+0

Stavo assegnando 'DatePickerDialog' da qualche altra parte, per cambiare minDate ho dovuto riassegnare' DatePickerDialog'. come 'mPicker = new DatePickerDialog (.., ..., ...., ..)' quindi resetta minDate e setMinDate. La risposta @Nicolas è stata utile in reset.3. – Prabs

0

primo aggiornamento setMinDate a 0 dopo che l'allora setMinDate secondo voi dateobject

mPicker.setMinDate (0);

mPicker.setMinDate (datepickerObject.getTimeInMillis());

0

Questa non è una buona soluzione a questo problema, ma funziona per me. Sto semplicemente creando un nuovo DatePicker ogni volta che si fa clic su TextView e si impostano le date necessarie (min, max). Potrebbe non essere adatto alla memoria, ma non ho trovato altre soluzioni.

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

Come detto in precedenza, è possibile bypassare il controllo chiamando coloro che prima di poter realmente cambiare il valore:

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

Se si vuole ripristinare il valore minimo o massimo al suo valore predefinito, è possibile utilizzare i seguenti valori:

setMinDate(-2208902400000L); // Jan 1, 1900 
setMaxDate(4102531200000L); // Jan 1, 2100 
Problemi correlati