0

我有几个按钮,它们最初分别显示当前日期和当前时间。单击显示日期的按钮时,会显示一个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
4

1 回答 1

0

问题可能是

initDate.set(Calendar.DAY_OF_WEEK, day);

在你的setInitDate(). 这仅更新星期几。所以你的日期跳跃+-6

利用

initDate.set(Calendar.DAY_OF_MONTH, day);
于 2013-08-30T19:26:13.863 回答