Android DatePicker年份未更新

时间:2014-10-27 21:10:06

标签: android datepicker

我遇到了我认为是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 - 默认值。

enter image description here

其他参考资料:

  • OS v4.0.4(冰淇淋三明治)
  • 目标API 4.0

1 个答案:

答案 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。