Android 当用户编辑字段中的值时,自定义日期选择器作为首选项不保留值

Android 当用户编辑字段中的值时,自定义日期选择器作为首选项不保留值,android,datepicker,preference,Android,Datepicker,Preference,我创建了一个DatePickerReference,也就是说,我扩展了DialogPreference,并在其中创建了一个DatePicker对象,使它几乎完美地工作。当您上下单击箭头并保存所选值时,它会更改值 但是,如果在字段内单击并在其中键入新值,则不会保存更新后的值!使用箭头时,始终调用onDateChanged()方法;当用户输入字段并编辑它时,只有在他选择另一个字段时,它才会调用onDateChanged(在这种情况下,如果他编辑最后一个字段并点击OK,最后一次编辑将被忽略)。我发现

我创建了一个DatePickerReference,也就是说,我扩展了DialogPreference,并在其中创建了一个DatePicker对象,使它几乎完美地工作。当您上下单击箭头并保存所选值时,它会更改值

但是,如果在字段内单击并在其中键入新值,则不会保存更新后的值!使用箭头时,始终调用onDateChanged()方法;当用户输入字段并编辑它时,只有在他选择另一个字段时,它才会调用onDateChanged(在这种情况下,如果他编辑最后一个字段并点击OK,最后一次编辑将被忽略)。我发现

这是我的密码:


    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;
}

由于该类扩展了
对话框首选项
类,因此它已使用按钮处理更改
共享引用
。要在用户键入新日期后正确更新日期变量,您需要手动更新
SharedReference

您可以按如下方式执行此操作:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor preferences = prefs.edit();
preferences.putLong("mdate_key", mDate.getTime());
preferences.commit();
这里,mdate_键将对应于
PreferenceActivity
XML文件中使用的
DatePickerPreference


我建议您在
onDateChanged()
onDestroy()

中执行此操作。请查看DatePreference库:



这应该可以解决你的问题。

我也有同样的问题。解决方案非常简单。日期选择器仅在失去焦点时更新编辑的值,因此在获取值之前,必须调用:

datePicker.clearFocus();
通话结束后,您可以拨打:

selectedDay = datePicker.getDayOfMonth();
selectedMonth = datePicker.getMonth();

并更新值。

有什么问题?(即,您试图实现什么?)当用户在天/月/年字段中单击输入值并键入正确的值时,该值不会更新。仅当用户使用向上/向下箭头设置日期时,它才起作用。我希望它能够使用箭头或直接在字段中输入值进行更新…这并不能解决问题,但我认为当用户更改日期时,mDate不会得到更新,这就是为什么关闭时它不会更新值。