TextView et DatePicker sous Android

Lorsque j'ai voulu pour la première fois créer un champ de saisie de type date, je m'attendais à trouver un composant tout prêt dans Android. Ce n'est pas tout à fait le cas !

Il y a bien le composant DatePicker pour la sélection de la date proprement dite et la boite de dialogue DatePickerDialog qui contient celui-ci. Par contre, il n'y a pas de composant TextView (ou EditText) associé pour visualiser la date choisie et pour ouvrir la boite de dialogue. En me basant sur le tutoriel hello-datepicker, j'ai créé la petite classe utilitaire suivante afin d'avoir un composant réutilisable :

public class DatePickerHelper {
private static final int DATE_DIALOG_ID = 0;
private final Activity activity;
private TextView textView;
public DatePickerHelper(Activity activity) {
this.activity = activity;
}

public void init(final TextView textView) {
this.textView = textView;
textView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (textView.isEnabled()) {
activity.showDialog(DATE_DIALOG_ID);
return true; // processed=true
} else {
return false; // processed=false
}
}
});
}

public void setTextFieldValue(Date date) {
textView.setText(DateUtils.formatDate(date));
}

public Dialog createDialog(int id) {
DatePickerDialog.OnDateSetListener listener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
textView.setText(DateUtils.formatDate(year, monthOfYear, dayOfMonth));
}
};

if (DATE_DIALOG_ID == id) {
DateRecord date = parseDate();
return new DatePickerDialog(activity, listener, date.year, date.monthOfYear, date.dayOfMonth);
}
return null;
}

public Date parseTextFieldValue() {
DateRecord date = parseDate();
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, date.year);
c.set(Calendar.MONTH, date.monthOfYear);
c.set(Calendar.DAY_OF_MONTH, date.dayOfMonth);
return c.getTime();
}

private DateRecord parseDate() {
return DateUtils.parseDate(textView.getText().toString());
}
}

Remarques :

  • Je n'ai pas mis le code de la classe DateRecord : c'est une simple classe qui contient les champs year, monthOfYear et dayOfMonth.
  • La classe DateUtils, également absente de cet article, fait la conversion entre une chaine de caractères et un objet de type DateRecord.

La classe DatePickerHelper s'utilise de la manière suivante dans l'activité Android contenant le champ date :

public class MonActivite extends Activity {
private TextView dateNaissanceTextView;
private final DatePickerHelper dateHelper = new DatePickerHelper(this);

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
..........
dateNaissanceTextView = (TextView) findViewById(R.id.dateNaissanceTextView);
dateHelper.init(dateNaissanceTextView);
..........
}

@Override
protected Dialog onCreateDialog(int id) {
Dialog dialog = dateHelper.createDialog(id);
if (dialog == null) {
dialog = super.onCreateDialog(id);
}
return dialog;
}

public void refreshDossierFromView(Dossier dossier) {
..........
dossier.setDateNaissance(dateHelper.parseTextFieldValue());
..........
}

public void refreshViewFromDossier(Dossier dossier) {
..........
dateHelper.setTextFieldValue(dossier.getDateNaissance());
..........
}
}

Voila ! Maintenant lorsque vous cliquez sur le champ texte, une boite de dialogue apparait pour vous permettre de choisir une date.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.