我遇到了我认为是DatePicker的错误。
我有一个日期选择器对话框:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal"
android:paddingLeft="20dp"
android:paddingRight="20dp"
>
<DatePicker
android:id="@+id/datePicker"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:calendarViewShown="false"
android:layout_gravity="center_horizontal"
android:paddingBottom="20dp"
android:paddingTop="10dp"
>
</DatePicker>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="horizontal"
android:weightSum="1"
android:gravity="center_horizontal"
>
<Button
android:id="@+id/cmdCancel"
android:text="@android:string/cancel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".5"
>
</Button>
<Button
android:id="@+id/cmdOK"
android:text="@android:string/ok"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".5"
>
</Button>
</LinearLayout>
</LinearLayout>
我得到一个句柄,并在需要日期条目时显示对话框。 Ok
按钮代码如下:
Button cmdOK = (Button)dialogDate.findViewById(R.id.cmdOK);
cmdOK.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
int day = datePicker.getDayOfMonth();
int month = datePicker.getMonth()+1; // offset index
int year = datePicker.getYear();
String dob = month+"/"+day+"/"+year;
txtDOB.setText(dob);
closeDialogDate();
} catch (Exception e) {
e.printStackTrace();
}
}
});
一切按预期工作,只有一种情况,我可以重复这种行为。
问题:
如果我通过点击数字选择年份并获得数字小键盘,请输入日期,这是最后一次输入,是否我在键盘上点击done
或只需点击Ok
按钮,执行处理,年份没有得到正确更新。如果我在点击Ok
之前选择日期或月份值,则年份会正确更新。如果我使用微调器,年份会正确更新。错误出现的唯一时间是它是最后一次并直接输入的值。
我做得不好?
这不是-1900问题。使用提供的屏幕截图,值将更改为1990,并且返回的是1984 - 默认值。
其他参考资料:
答案 0 :(得分:4)
听起来像是在手动输入的年份有机会保存到DatePicker之前触发按钮点击回调。
我相信月份和日期字段“有效”,因为当您填写值时,它们会自动重新聚焦到下一个字段(将值保存到DatePicker)。但是,我能够通过输入一位数的日期,关闭键盘,然后按“确定” - 日期值未保存来强制Day字段按您描述的方式运行。
让我们来看看DatePickerDialog的“OK”方法的来源:
public void onClick(DialogInterface dialog, int which) {
if (mCallBack != null) {
mDatePicker.clearFocus();
mCallBack.onDateSet(mDatePicker, mDatePicker.getYear(),
mDatePicker.getMonth(), mDatePicker.getDayOfMonth());
}
}
由于您的按钮似乎是自定义布局项(即您没有使用实际的DatePickerDialog),因此您应该在获取日期之前在DatePicker上调用clearFocus()
。或者,使用DatePickerDialog。