Boite de dialogue sous Android

En Java / Swing, chaque méthode showXxxDialog de la classe JOptionPane crée une boite de dialogue modale demandant une action utilisateur. Elle est modale car l'utilisateur ne peut faire aucune action en dehors de celle-ci. Prenons l'exemple suivant :

int reponse = JOptionPane.showConfirmDialog(null, "Voulez-vous supprimer ce fichier ?", "Confirmation", JOptionPane.YES_OPTION);
if (reponse == JOptionPane.YES_NO_OPTION) {
// ... action si réponse = Oui
}

On constate que l'appel est synchrone, c'est à dire que la méthode retourne une valeur qui permet de traiter la réponse immédiatement.

Sous Android, les boites de dialogues sont aussi modales. Par contre, le traitement de la réponse doit être fait de manière asynchrone.
Il faut donc utiliser une stratégie de développement différente, basée sur les callback. Dans l'exemple d'une boite de dialogue Oui/Non, il faut une callback pour la réponse Oui et éventuellement une autre pour la réponse Non. Le code sous Android ressemble donc à ceci :

Activity activity = .....; // récupération de l'Activity courante
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage("Voulez-vous supprimer ce fichier ?");
builder.setPositiveButton("Oui", new DialogInterface.OnClickListener() { // définition de la callback pour la réponse Oui
@Override
public void onClick(DialogInterface dialog, int which) {
// ... action si réponse = Oui
}
});
builder.show(); // ne retourne pas le choix de l'utilisateur
// arrivé à la ligne suivante, l'utilisateur n'a peut être pas encore répondu à la question (car appel asynchrone)

Afin de rendre le code un peu plus clair, j'ai créé une classe abstraite appelée Command :

abstract public class Command implements DialogInterface.OnClickListener {
@Override
public final void onClick(DialogInterface dialog, int which) {
execute();
dialog.dismiss();
}

abstract public void execute();
}

J'ai également créé la méthode suivante :

public void displayYesNoDialog(Activity context, int messageId, Command commandYes) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(context.getString(messageId));
builder.setPositiveButton("Oui", commandYes);
builder.show();
}

Je l'appelle comme ça :

Activity activity = .....; // récupération de l'Activity courante
int messageId = .....; // récupération de l'identifiant du message "Voulez-vous supprimer ce fichier ?"
Command yesCommand = new Command() {
public void execute() {
// ... action si réponse = Oui
}
};
displayYesNoDialog(activity, messageId, yesCommand);

Un commentaire

  1. Vous avez dit:
    >Elle est modale car l’utilisateur ne peut faire aucune action en dehors de celle-ci

    et un peut plus loin:
    >Sous Android, les boites de dialogues sont aussi modales.
    Justement, j’ai l’impression qu’on ne peut pas dire cela puisque l’utilisateur peut cliquer à côté par exemple et ca fermera la boite de dialogue. Je me trompe ou pas ?

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.