2013-08-30 4 views
0

У меня есть несколько кнопок, которые изначально отображают текущую дату и текущее время соответственно. При нажатии на кнопку, которая отображает дату, она показывает DatePickerFragment, которая позволяет пользователю выбирать дату, а затем изменяет текст кнопки на дату, выбранную пользователем. Другая кнопка делает то же самое, но с TimePickerFragment.
Для инициализации кнопок, которые я использую следующий код:DateFormat производит неправильный вывод

protected void onCreate(Bundle savedInstanceState){ 
... 
df = DateFormat.getDateInstance(); 
tf = DateFormat.getTimeInstance(); 
initDate = new GregorianCalendar(); 
... 
updateDateButtons(); 
updateTimeButtons(); 
} 


private void updateTimeButtons() { 
    tf.setCalendar(initDate); 
    String text = tf.format(initDate.getTime()); 
    btnIniTime.setText(text.substring(0, text.lastIndexOf(":"))); 
} 
private void updateDateButtons() { 
    df.setCalendar(initDate); 
    btnIniDate.setText(df.format(initDate.getTime())); 
} 

Первоначально обе кнопки ведут себя ожидаемым образом: btnIniTime показывает текущее время и btnIniDate показывает текущую дату.
Как я уже сказал, когда пользователь нажимает кнопку btnIniTime, он показывает TimePickerFragment, который предлагает пользователю выбрать время, и выбранное время отображается правильно в btnIniTime.
Проблема начинается с btnIniDate, что должно делать то же самое, но с использованием DatePickerFragment вместо TimePickerFragment. Когда пользователь выбирает дату, кнопка показывает неверную дату. Например, если я выберу 2013 30 августа, отображаемая дата станет до 2013 года 26 августа. Если я выберу 2013 сентябрь, она покажет 2013 сентябрь 29!
классы и методы, которые я использую, чтобы изменить дату ара расположены следующим образом:

public abstract static class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { 
    protected TaskActivity activity; 
    protected Calendar c; 
    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     this.activity = (TaskActivity) activity; 
    } 

    @Override 
    public abstract Dialog onCreateDialog(Bundle savedInstanceState); 

    public void onDateSet(DatePicker view, int year, int month, int day) { 
     if(activity instanceof TaskActivity){ 
      setDateResult(year, month, day); 
     } 
    } 

    protected abstract void setDateResult(int year, int month, int day); 
} 
public static class InitDatePickerFragment extends DatePickerFragment { 
    @Override 
    protected void setDateResult(int year, int month, int day) { 
     activity.setInitDate(year, month, day); 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     final Calendar c = activity.getInitDate(); 
     int year = c.get(Calendar.YEAR); 
     int month = c.get(Calendar.MONTH); 
     int day = c.get(Calendar.DAY_OF_MONTH); 

     // Create a new instance of DatePickerDialog and return it 
     return new DatePickerDialog(getActivity(), this, year, month, day); 
    } 
} 
... 
public Calendar getInitDate() { 
    return initDate; 
} 
public void setInitDate(int year, int month, int day){ 
    Log.d("TaskActivity", "Year: " + year + "; Month: " + month + "; Day: " + day); 
    initDate.set(Calendar.YEAR, year); 
    initDate.set(Calendar.MONTH, month); 
    initDate.set(Calendar.DAY_OF_WEEK, day); 
    updateDateButtons(); 
} 

При нажатии на кнопку:

@Override 
public void onClick(View v) { 
    if(v.equals(btnIniDate)){ 
     DialogFragment newFragment = new InitDatePickerFragment(); 
     newFragment.show(getSupportFragmentManager(), "initDatePicker"); 
    } 
    ... 
} 

Кстати, при установке даты LogCat производит следующий вывод (я выбрал 2013 30 авг):

Year: 2013; Month: 7; Day:30 
+0

Пожалуйста, обратите внимание, что месяц в дан в виде 0-11, а не 1-12. – rciovati

+0

Я знаю это. Но это не проблема. В любом случае, спасибо. – Strunk18

ответ

0

Проблема может быть

initDate.set(Calendar.DAY_OF_WEEK, day); 

в вашем setInitDate(). Это обновляется только в день недели. Таким образом, ваша дата перепрыгивает + -6

использование

initDate.set(Calendar.DAY_OF_MONTH, day); 
Смежные вопросы