2

我正在尝试创建一个日期选择器片段,但遇到了日历上方的年份没有正确更新的问题。

我遇到的第一个问题是,如果我使用向上/向下年份按钮,片段的标题会更改为“设置日期”,并且日历上方的年份不会更新(日期网格会更新)。

第二个问题是当我用未来或过去的日期打开它时,它在标题和日历上方显示的日期是非常错误的。

展望未来,断点发生在 2037/4/11 和 2038/4/11 之间。虽然我还没有找到确切的日期,但我怀疑潜伏在后台的 32 位 unix 时间以某种方式涉及。

回到过去,但中断发生在 1902/4/11 和 1901/4/11 之间;它与 32 位时间戳的开头不一致,但与跨入 2038 年时看到的无效日期相对应。

这发生在我用于测试的 4.1 平板电脑以及 4.1 和 4.2 AVD 中。屏幕截图是从平板电脑 AVD 中截取的。

在这一点上,我想知道我是否做错了什么,或者在操作系统本身中发现了一个错误。

初始状态,今天加载: 初始状态,今天加载

按+年按钮后,日历上方的错误标题年份未更新:
按+年按钮后

加载日期为 2037,初始状态良好: 加载日期为 2037

加载了 2038 年的日期,注意时间在标题和日历上方回溯到 1902 年: 加载了 2038 日期

加载了 1902 年的日期,没有错: 装载了 1902 年的日期

加载了 1901 年的日期,注意时间在标题和日历上方向前弯曲到 2037 年: 装载了 1901 年的日期

我的片段类:

public class DatePickerFragment extends DialogFragment {
    private static int _month = 0;
    private static int _day = 0;
    private static int _year = 0;
    private static int _buttonId = 0;

    public DatePickerFragment(){
    }

    public static final DatePickerFragment newInstance(int buttonId, int year, int month, int day) {
        DatePickerFragment f = new DatePickerFragment();
        _buttonId = buttonId;
        _year = year;
        _month = month;
        _day = day;
        return f;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new DatePickerDialog(getActivity(),  mDateSetListener, _year, _month, _day);
    }

    private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {

        @Override
        public void onDateSet(DatePicker view, int year, int month, int day) {
                    //update the control whose press opened the DatePpickerFragment
            Button _button = (Button)getActivity().findViewById (_buttonId);
            if(_button != null) {
                _button.setText(month+1 + "/" + day + "/" + year);
            }
        }
    };
}

以及安装打开片段的按钮处理程序的代码:

    Button button = (Button) findViewById(buttonID);

    button.setOnClickListener( new View.OnClickListener() {
        public void onClick(View v) {

            Button button = (Button) v;
            DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
            Calendar c = Calendar.getInstance();
            try {
                c.setTime(df.parse(button.getText().toString()));
            } catch (ParseException e) {
                // Do nothing. Calendar defaults to the current date. Use that instead.
            }

            int year = c.get(Calendar.YEAR);
            int month = c.get(Calendar.MONTH);
            int day = c.get(Calendar.DAY_OF_MONTH);

            final DatePickerFragment newFragment = DatePickerFragment.newInstance(button.getId(), year, month, day);
            newFragment.show(getFragmentManager(), "");
        }
    });
}
4

0 回答 0