2010-11-22 26 views
6

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

Quelle est la question? (c'est-à-dire, qu'essayez-vous d'accomplir?) – yuku

+0

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

+0

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

Répondre

1

Depuis cette classe étend la classe DialogPreference, il gère déjà changer le SharedPreference à l'aide des boutons. Pour mettre à jour correctement votre variable de date après que l'utilisateur a tapé la nouvelle date, vous devez mettre à jour le SharedPreference manuellement.

Vous pouvez le faire comme suit:

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

Ici, mdate_key correspondra à la clé DatePickerPreference utilisé dans le fichier XML PreferenceActivity. Je recommande soit de le faire en onDateChanged() ou onDestroy().

0

J'ai eu le même problème. La solution est très simple. Le sélecteur de date met à jour les valeurs modifiées que si elle Losts mise au point, donc avant d'obtenir les valeurs que vous devez appeler:

datePicker.clearFocus(); 

Après cela, vous appelez pouvez appeler:

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

et ont les valeurs mises à jour.