我有几个按钮,分别最初显示当前日期和当前时间。单击显示日期的按钮时,它会显示允许用户选择日期的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
,应该执行相同的操作,但使用DatePickerFragment
而不是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
答案 0 :(得分:0)
问题可能是
initDate.set(Calendar.DAY_OF_WEEK, day);
在setInitDate()
中。这仅更新一周中的某一天。所以你的日期跳了+ -6
使用
initDate.set(Calendar.DAY_OF_MONTH, day);