2010-11-22 3 views
6

Я создал DatePickerPreference, т. Е. Я расширил DialogPreference и создал объект DatePicker внутри, и он работал почти отлично. Он изменяет значения, когда вы нажимаете стрелки вверх и вниз и сохраняет выбранное значение.Custom DatePicker as Preference не сохраняет значение, когда пользователь редактирует значение в поле

Однако, если вы нажмете внутри поля и наберете новое значение, оно не сохранит обновленное значение! При использовании стрелок всегда вызывается метод onDateChanged(); когда пользователь вводит это поле и редактирует его, он будет вызывать только onDateChanged, если он выберет другое поле (и в этом случае, если он отредактирует последнее поле и просто нажмите ОК, последнее редактирование будет проигнорировано). Я обнаружил, что 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

В чем вопрос? (т. е. чего вы пытаетесь достичь?) – yuku 2010-11-23 05:20:06

ответ

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 ключа, используемого в файле PreferenceActivity XML.

Я рекомендую либо делать это в onDateChanged(), либо onDestroy().

0

У меня была та же проблема. Решение очень простое. Выбор даты обновляет измененные значения только тогда, когда проигрыши фокуса, поэтому перед тем, как значения, которые вы должны вызвать:

datePicker.clearFocus(); 

После этого вызова вы можете позвонить:

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

и имеют значений обновляются.