У меня есть несколько кнопок, которые изначально отображают текущую дату и текущее время соответственно. При нажатии на кнопку, которая отображает дату, она показывает 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-11, а не 1-12. – rciovati
Я знаю это. Но это не проблема. В любом случае, спасибо. – Strunk18