我有几个按钮,它们最初分别显示当前日期和当前时间。单击显示日期的按钮时,会显示一个DatePickerFragment
允许用户选择日期的按钮,然后将按钮的文本更改为用户选择的日期。另一个 Button 的功能完全相同,但带有TimePickerFragment
.
要初始化按钮,我使用以下代码:
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
,应该做同样的事情,但使用 aDatePickerFragment
而不是 a TimePickerFragment
。当用户选择日期时,按钮会显示不正确的日期。例如,如果我选择 2013 年 8 月 30 日,则显示日期变为 2013 年 8 月 26 日。如果我选择 2013 年 9 月 1 日,则显示 2013 年 9 月 29 日!
我用来更改日期 ara 的类和方法按以下方式排列:
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 年 8 月 30 日):
Year: 2013; Month: 7; Day:30