J'ai créé une DatePickerPreference, c'est-à-dire que j'ai étendu DialogPreference et créé un objet DatePicker à l'intérieur et l'ai fonctionné presque parfaitement. Il change les valeurs lorsque vous cliquez sur les flèches haut et bas et enregistre la valeur que vous sélectionnez. Cependant, si vous cliquez à l'intérieur du champ et y tapez la nouvelle valeur, il n'enregistre pas la valeur mise à jour!DatePicker personnalisé en tant que préférence ne conserve pas de valeur lorsque l'utilisateur modifie la valeur dans le champ
Lorsque vous utilisez les flèches, la méthode onDateChanged() est toujours appelée; Lorsque l'utilisateur entre dans le champ et l'édite, il n'appellera onDateChanged que s'il sélectionne un autre champ (et dans ce cas, s'il édite le dernier champ et appuie simplement sur OK, la dernière édition sera ignorée). J'ai trouvé que Eric Besette posted a similar problem with his TimePickerPreference
Voici mon code:
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;
}
Quelle est la question? (c'est-à-dire, qu'essayez-vous d'accomplir?) – yuku
Lorsque l'utilisateur entre la valeur en cliquant dans le champ jour/mois/année et tape la valeur correcte, la valeur n'est pas mise à jour. Cela ne fonctionne que si l'utilisateur définit la date en utilisant les flèches haut/bas. Je veux le mettre à jour en utilisant les flèches ou en entrant la valeur directement dans le champ ... – OtavioKR
Ceci ne le résout pas, mais je ne pense pas que mDate soit mis à jour quand un utilisateur change la date, c'est pourquoi quand vous fermez cela ne met pas à jour la valeur. – stealthcopter