我正在尝试创建一个日期选择器片段,但遇到了日历上方的年份没有正确更新的问题。
我遇到的第一个问题是,如果我使用向上/向下年份按钮,片段的标题会更改为“设置日期”,并且日历上方的年份不会更新(日期网格会更新)。
第二个问题是当我用未来或过去的日期打开它时,它在标题和日历上方显示的日期是非常错误的。
展望未来,断点发生在 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,初始状态良好:
加载了 2038 年的日期,注意时间在标题和日历上方回溯到 1902 年:
加载了 1902 年的日期,没有错:
加载了 1901 年的日期,注意时间在标题和日历上方向前弯曲到 2037 年:
我的片段类:
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(), "");
}
});
}