我创建了一个DatePickerPreference,即我扩展了DialogPreference并在其中创建了一个DatePicker对象,并让它几乎完美地工作。当您单击上下箭头并保存您选择的值时,它会更改值。
但是,如果您在字段内单击并在那里键入新值,则不会保存更新的值!使用箭头时,始终调用onDateChanged()方法;当用户进入该字段并对其进行编辑时,如果他选择另一个字段,它将仅调用onDateChanged(在这种情况下,如果他编辑最后一个字段并且只是点击OK,则将忽略最后一次编辑)。我发现Eric Besette posted a similar problem with his TimePickerPreference
这是我的代码:
public class DatePickerPreference extends DialogPreference implements
OnDateChangedListener, OnDateSetListener {
@Override
protected View onCreateDialogView() {
DatePicker picker = new DatePicker(getContext());
mDate = getPersistedLong(System.currentTimeMillis());
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(mDate);
int day = calendar.get(Calendar.DAY_OF_MONTH);
int month = calendar.get(Calendar.MONTH);
int year = calendar.get(Calendar.YEAR);
picker.init(year, month, day, this);
return picker;
}
public void onDateChanged(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
mDate = (new Date(year - 1900, monthOfYear, dayOfMonth)).getTime();
}
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
onDateChanged(view, year, monthOfYear, dayOfMonth);
}
@Override
public void setDefaultValue(Object defaultValue) {
super.setDefaultValue(String.valueOf((
new Date(String.valueOf(defaultValue))).getTime()));
}
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
if(positiveResult) {
if(isPersistent()) {
persistLong(mDate);
}
callChangeListener(String.valueOf(mDate));
}
}
public int getYear() { /*(...)*/ }
public int getMonth() { /*(...)*/ }
public int getDay() { /*(...)*/ }
public DatePickerPreference(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public DatePickerPreference(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public void init() { setPersistent(true); }
public void setDate(Date date) { mDate = date.getTime(); }
public void setDate(long milisseconds) { mDate = milisseconds; }
public String getDate(int style) {
return DateFormat.getDateInstance(style).format(new Date(mDate));
}
public long getDate() { return mDate; }
private long mDate;
public static final int DATE_SHORT = DateFormat.SHORT;
public static final int DATE_MEDIUM = DateFormat.MEDIUM;
public static final int DATE_LONG = DateFormat.LONG;
public static final int DATE_FULL = DateFormat.FULL;
public static final int DATE_DEFAULT = DateFormat.DEFAULT;
}
答案 0 :(得分:1)
由于此类扩展了DialogPreference
类,因此它已经使用按钮处理更改SharedPreference
。要在用户键入新日期后正确更新日期变量,您需要手动更新SharedPreference
。
您可以按照以下方式执行此操作:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor preferences = prefs.edit();
preferences.putLong("mdate_key", mDate.getTime());
preferences.commit();
此处,mdate_key将对应DatePickerPreference
XML文件中使用的PreferenceActivity
密钥。
我建议您在onDateChanged()
或onDestroy()
中执行此操作。
答案 1 :(得分:0)
请查看DatePreference库:
http://mikeburnscoder.wordpress.com/2010/09/27/datepreference-an-android-library/
https://github.com/bostonandroid/DatePreference
这可以解决您的问题。
答案 2 :(得分:0)
我有同样的问题。解决方案非常简单。日期选择器仅在失去焦点时更新已编辑的值,因此在获取您必须调用的值之前:
datePicker.clearFocus();
拨打此电话后,您可以致电:
selectedDay = datePicker.getDayOfMonth();
selectedMonth = datePicker.getMonth();
并更新值。