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;
}
何が質問ですか? (達成しようとしているもの) – yuku
ユーザーが日/月/年フィールドをクリックして値を入力し、正しい値を入力すると、値は更新されません。ユーザーが上矢印または下矢印を使用して日付を設定した場合のみ機能します。矢印を使用して更新するか、フィールドに値を直接入力することができます。 – OtavioKR
これは解決しませんが、ユーザーが日付を変更したときにmDateが更新されるとは思われません。あなたは値を更新していません。 – stealthcopter