2010-11-22 8 views
6

DatePickerPreferenceを作成しました。つまり、DialogPreferenceを拡張し、内部にDatePickerオブジェクトを作成してほぼ完璧に動作させました。矢印を上下にクリックして値を変更し、選択した値を保存します。フィールドの値を編集するときに、カスタムのDatePickerが値を保持しない

ただし、フィールド内をクリックしてそこに新しい値を入力すると、更新された値は保存されません。矢印を使用する場合、onDateChanged()メソッドは常に呼び出されます。ユーザーがフィールドを入力して編集すると、別のフィールドを選択した場合にのみonDateChangedが呼び出されます(この場合、最後のフィールドを編集してOKを押すと最後の編集は無視されます)。このクラスはDialogPreferenceクラスを拡張


    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

+0

ユーザーが日/月/年フィールドをクリックして値を入力し、正しい値を入力すると、値は更新されません。ユーザーが上矢印または下矢印を使用して日付を設定した場合のみ機能します。矢印を使用して更新するか、フィールドに値を直接入力することができます。 – OtavioKR

+0

これは解決しませんが、ユーザーが日付を変更したときにmDateが更新されるとは思われません。あなたは値を更新していません。 – stealthcopter

答えて

1

ので、それはすでにボタンを使用してSharedPreferenceを変更ハンドル:私はEric Besette posted a similar problem with his TimePickerPreference

はここに私のコードであることがわかりました。ユーザーが新しい日付を入力した後に日付変数を正しく更新するには、SharedPreferenceを手動で更新する必要があります。次のようにあなたがこれを行うことができます

ここ
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
SharedPreferences.Editor preferences = prefs.edit(); 
preferences.putLong("mdate_key", mDate.getTime()); 
preferences.commit(); 

を、mdate_keyはPreferenceActivity XMLファイルで使用DatePickerPreferenceキーに対応します。

onDateChanged()またはonDestroy()でこれを行うことをおすすめします。

0

私は同じ問題がありました。解決策は非常に簡単です。日付ピッカーは、それがフォーカスをlostsだけ編集した値を更新し、その値を取得する前に呼び出す必要があります:あなたが呼び出すことができます呼び出すこの後

datePicker.clearFocus(); 

を:

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

をし、更新された値を持っています。

関連する問題